L’utilisation d’une directive de préprocesseur pour définir ce qu’un signe dollar représente entraînera-t-elle des conflits?

Puis-je utiliser les éléments suivants en C ++ ?

#define $ cout int main(){ $<<"Hello World!\n"; return 0; } 

Je me demande si cela causera des conflits.

Ce n’est pas définitivement légal , mais votre implémentation est autorisée à l’accepter.

Considérer:

[C++11: 2.5/1]: chaque jeton de prétraitement converti en jeton (2.7) doit avoir la forme lexicale d’un mot-clé, d’un identificateur, d’un littéral, d’un opérateur ou d’un ponctuateur.

Ici, votre $ n’est évidemment pas un mot-clé, un opérateur ou un ponctuateur (comme ceux-ci sont énumérés dans la norme), et il ne ressemble pas à un littéral, il ne peut donc s’agir que d’un identifiant; maintenant, les identifiants ne doivent contenir que des caractères alphanumériques et des traits de soulignement, et les chiffres ne peuvent pas être en tête (d’après la grammaire indiquée sous [C++11: 2.11] ).

Cependant, la norme autorise également les implémentations à accepter d’ autres caractères. Par conséquent, ce que vous souhaitez faire peut fonctionner, mais il ne sera pas portable.

C’est le comportement défini par l’implémentation. $ n’est pas inclus dans la grammaire pour un identifiant. Les règles pour les noms d’identifiant en C ++ sont les suivantes:

  1. Ça ne peut pas commencer par un chiffre
  2. Peut être composé de lettres, chiffres, traits de soulignement, noms de caractères universels et caractères définis pour la mise en oeuvre
  3. Ne peut pas être un mot clé .

Mais il autorise les caractères définis par l’ implémentation que de nombreux compilateurs prennent en charge en tant qu’extension, notamment gcc et Visual Studio .

La grammaire actuelle est traitée dans la section 2.11 du projet de norme C ++ standard .

 identifier: identifier-nondigit <- Can only start with a non-digit identifier identifier-nondigit <- Next two rules allows for subsequent identifier digit <- characters to be those outlined in 2 above identifier-nondigit: nondigit <- az, AZ and _ universal-character-name other implementation-defined characters [...] 

Nous pouvons voir que cela s’applique pour define partir de la section 16 directives de prétraitement . On peut voir d'après la grammaire qu'il doit s'agir d'un identifiant :

 # define identifier replacement-list new-line # define identifier lparen identifier-listopt) replacement-list new-line # define identifier lparen ... ) replacement-list new-line # define identifier lparen identifier-list, ... ) replacement-list new-line ^^^^^^^^^^ 

Il existe une situation amusante avec certains compilateurs qui permettent d’utiliser $ dans les identifiants. Par exemple, au moins MS VC ++ 2010 permet d’utiliser les identificateurs $ in.

Donc, si par exemple vous avez défini

 char $ = '$'; 

et ensuite écrit

 #define $ std::cout //... $ << $; 

alors, au lieu du symbole $, vous verrez dans la sortie de la console le numéro 1 ou un nombre entier. 🙂