2010-08-20 4 views
8

Une question hypothétique: est-il possible d'avoir un programme C++, qui inclut des directives de préprocesseur, entièrement sur une seule ligne?Directives de préprocesseur multiples sur une ligne en C++

Une telle ligne ressemblerait à ceci:

#define foo #ifdef foo #define bar #endif 

Quelles sont la sémantique d'une telle ligne?

De plus, existe-t-il des combinaisons de directives impossibles à construire sur une ligne?

Si cela est spécifique au compilateur, les réponses VC++ et GCC sont les bienvenues.

Répondre

11

Une directive de pré-traitement doit se terminer par un saut de ligne, donc c'est en fait une seule directive de pré-traitement qui définit une macro comme objet, nommé foo, qui se développe à la séquence symbolique suivante:

# ifdef foo # define bar # endif 

Tous plus tard l'utilisation du nom foo dans la source (jusqu'à ce que ce soit #undef ed) va s'étendre à cela, mais une fois la macro développée, les jetons qui en résultent ne sont pas évalués en tant que directive de prétraitement.

Ceci n'est pas spécifique au compilateur; Ce comportement est défini par les normes C et C++.

6

Les directives du préprocesseur sont quelque peu différentes des instructions de langage, qui se terminent par ; et utilisent des espaces pour délimiter les jetons. Dans le cas du préprocesseur, la directive est terminée par une nouvelle ligne, il est donc impossible de faire ce que vous essayez d'utiliser le langage C++ lui-même. Une façon de simuler est de placer les lignes souhaitées dans un fichier d'en-tête séparé, puis #include où vous voulez. L'en-tête séparé doit toujours avoir chaque directive sur une ligne, mais le point où vous l'incluez est juste une seule ligne, faisant effectivement ce que vous avez demandé. Une autre façon d'accomplir quelque chose comme cela est d'avoir un fichier pré-C++ que vous utilisez un processus externe pour le traitement dans un fichier source C++ avant de compiler avec votre compilateur C++. C'est probablement plutôt plus de problèmes que ça en vaut la peine.

Questions connexes