Pourquoi le standard CERT PRE00-CPP dit-il d’éviter de définir les macros

Selon les normes CERT, les macros de type object peuvent être dangereuses car leur utilisation n’est pas soumise aux règles de scope du langage . Quelqu’un peut-il s’il vous plaît expliquer avec un exemple en quoi c’est problématique? disons par exemple, j’ai une macro semblable à un object #define BUFFER_SIZE 1024

 // file a.hpp #define SOME_MACRO 42 // file some/nested/dir/really/far/in/x.hpp #define SOME_MACRO 13 

Kaboom. Cela aurait facilement pu être évité avec n’importe quel type de scope, par exemple

 struct X { static unsigned const value = 42; }; struct Y { static unsigned const value = 13; }; 

Vous pouvez maintenant accéder à X::value et à Y::value . Il en va de même pour les espaces de noms:

 namespace a { struct X; } namespace b { struct X; } 

Le prétraitement C / C ++ consiste simplement à manipuler / générer du texte, aucune règle de langage n’est impliquée.

Un exemple classique est

 #define max 1234 ... class A { int arr[100]; public: ... int max() { ... find highest in arr ... } }; 

Cela ne comstackra pas.