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:
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. 🙂