# ifdef avec plusieurs jetons, est-ce légal?

Aujourd’hui, je suis tombé sur du code C ++ contenant une clause #ifdef comme celle-ci:

#ifdef DISABLE_UNTIL OTHER_CODE_IS_READY foo(); #endif 

Notez l’espace entre “DISABLE_UNTIL” et “OTHER_CODE_IS_READY”. Il existe essentiellement deux jetons spécifiés dans la ligne #ifdef.

Ma question est la suivante: s’agit-il d’un code C ++ légal? (g ++ le comstack sans erreur, et apparemment, il ignore simplement le deuxième jeton). Et si c’est légal, le deuxième jeton devrait-il avoir un effet?

[C++11 16.1] , [C++11 16.5] et, accessoirement, [C99 6.10.1/4] indiquent tous que cela est invalide.

si-groupe :
# if groupe de nouvelles lignes à expression constante opt
# ifdef identifiant groupe de nouvelle ligne opt
# ifndef identifiant groupe de nouvelle ligne opt

Un seul identifiant est légal.

La propre documentation de GCC accepte .

Mes propres tests suggèrent que seul le premier identifiant est accepté et que le second est simplement rejeté. Cela peut faciliter la mise en œuvre, mais la norme nécessite un diagnostic ici. Vous devriez donc le voir lorsque vous utilisez au moins l’ -pedantic .

 #include  using namespace std; #define A #define B int main() { #ifdef A std::cout << "a "; #endif #ifdef B std::cout << "b "; #endif #ifdef C std::cout << "c "; #endif #ifdef BC std::cout << "bc "; #endif #ifdef CB std::cout << "cb "; #endif return 0; } // Output: "ab bc" // Note: "cb" *not* output 

L'installation de GCC par Coliru l'émet avec ou sans -pedantic .

La syntaxe que vous avez publiée n’est pas légale et le sens voulu n’est pas clair.

En fonction de ce que vous espérez accomplir, pouvez-vous utiliser || ou && les combiner?
(Bien sûr, s’il s’agit du code de quelqu’un d’autre, je le rejetterais simplement comme inapproprié / inutilisable)

 #if defined(DISABLE_UNTIL) || defined(OTHER_CODE_IS_READY) foo(); #endif