Question

Au départ, je pensais que je devais, mais je finalement évité. Cependant, ma curiosité (et l'appétit pour le savoir, hum) me font demander:

Can une macro préprocesseur, par exemple dans

#include "MyClass.h"

INSTANTIATE_FOO_TEMPLATE_CLASS(MyClass)

étendre à l'autre comprennent, comme dans

#include "MyClass.h"

#include "FooTemplate.h"
template class FooTemplate<MyClass>;

?

Était-ce utile?

La solution

Je crois que ne peut pas être fait, cela est parce que le pré-processeur est une seule passe . Donc, il ne peut pas émettre d'autres directives de préprocesseur.

Plus précisément, à partir de la norme C99 (6.10.3.4 paragraphe 3):

  

3 Le résultat complètement   macro-jeton remplacé prétraiter   séquence ne sont pas traitées en tant que   directive de pré-traitement, même si elle   un ressemble à ...

Il est intéressant, c'est la raison pour laquelle l'opérateur unaire _Pragma a été ajouté à C99. Parce que #pragma ne pouvait pas être emited par des macros, mais _Pragma peut.

Autres conseils

La norme C dit ceci au sujet des directives (prétraiter C99 - 6.10 (2) - directives Prétraitement):

  

Une directive de prétraitement consiste en une séquence de jetons de pré-traitement qui commence par   un jeton # de pré-traitement qui (au début de la phase de traduction 4)   ...

et (C99 - 6,10 (7)):

  

Les jetons de pré-traitement dans une directive de pré-traitement ne sont pas soumis à la macro   d'expansion, sauf indication contraire.

     

Exemple Dans:

#define EMPTY
EMPTY # include <file.h>
     

la séquence de pré-traitement des jetons sur la deuxième ligne n'est pas une directive de pré-traitement, car elle ne commence pas par un # au début de la phase de traduction 4, même si elle le fera après a été remplacé la macro EMPTY

Alors, non, les macros ne peuvent se développer dans une directive de pré-traitement 'de #include'. Ces directives doivent être mises en place au début de la phase de traduction 4 (lors de la manipulation de ces directives prend place pré-traitement se passe-t). Depuis l'expansion macro se produit pendant la phase 4, les macros ne peuvent pas faire quelque chose d'exister au début de la phase 4.

Je voudrais souligner toutefois que les fait travail:

#ifdef WIN32
#define PLATFORM_HEADER "platform/windows/platform.h"
#else
#define PLATFORM_HEADER "platform/linux/platform.h"

#include PLATFORM_HEADER

parce que la norme C dit ceci (C99, 6.10.2 (4) - l'inclusion du fichier source):

  

Une directive de pré-traitement de la forme

# include pp-tokens new-line
     

(qui ne correspond pas à l'une des deux formes précédentes) est autorisée. le pré-traitement   jetons après inclure dans la directive sont traitées comme dans le texte normal. (Chaque   identificateur actuellement défini comme un nom de macro est remplacée par la liste de remplacement   jetons de prétraitement.)

Toutes les directives de préprocesseur sont interprétés avant l'expansion macro commence, donc pas, vous ne pouvez pas avoir une macro dans une directive étendre #include et ont être interprétées comme telles. Au lieu de cela, il sera interprété comme (erronée) du code C ++.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top