Oui. Le préprocesseur opérateur de concaténation (##
) va entraîner des problèmes, par exemple:
#define _add_penguin(a) penguin ## a
#define add_penguin(a) _add_penguin(a)
#define WIDTH (100)
#define HEIGHT 200
add_penguin(HEIGHT) // expands to penguin200
add_penguin(WIDTH) // error, cannot concatenate penguin and (100)
De même pour stringization (#
). C'est clairement un cas de coin et n'a probablement pas d'importance, considérant à quel WIDTH
va sans doute être utilisé. Pourtant, c'est quelque chose à garder à l'esprit sur le préprocesseur.
(La raison pour laquelle l'ajout de la deuxième pingouin échoue est un subtil détail de la prétraitement des règles en C99 - iirc il échoue parce que la concaténation de deux non-espace réservé prétraitement des jetons doit toujours résulter d'un simple prétraitement jeton - mais cela est sans importance, même si la concaténation a été autorisé, il serait encore donner un résultat différent de celui du unbracketed #define
!).
Toutes les autres réponses sont correctes seulement dans la mesure où il n'a pas d'importance du point de vue du C++ scanner car, en effet, un certain nombre est atomique. Cependant, à ma lecture de la question, il n'y a aucun signe que seuls les cas avec aucune autre préprocesseur d'expansion doit être considérée, de sorte que les autres réponses, même si je suis totalement d'accord avec les conseils qui y sont contenues, de mal.