définition de macro contenant de la directive #include
Est-il un moyen de définir une macro qui contient un #include
la directive dans son corps?
Si je viens de mettre
le "#include
", il donne l'erreur
C2162: "expected macro formal parameter"
depuis ici, je ne suis pas à l'aide de #
pour concaténer des chaînes.
Si j'utilise "\# include
", puis je recevoir les deux erreurs suivantes:
error C2017: illegal escape sequence
error C2121: '#' : invalid character : possibly the result of a macro expansion
Toute aide?
Vous devez vous connecter pour publier un commentaire.
Donc, comme le disent les autres, non, vous ne pouvez pas avoir de #inclure des instructions à l'intérieur d'une macro, depuis le préprocesseur ne fait qu'une seule passe. Cependant, vous pouvez faire le préprocesseur faire quasiment la même chose avec une gnarly truc que j'ai trouvé moi-même à l'aide récemment.
Réaliser que les directives de préprocesseur ne rien faire à l'intérieur d'une macro, mais ils VONT faire quelque chose dans un fichier. Donc, vous pouvez coller un bloc de code que vous souhaitez muter dans un fichier, la penser comme une définition de macro (avec des morceaux qui peuvent être modifiés par d'autres macros), et puis le #inclure cette pseudo-fichier de macro dans différents endroits (assurez-vous qu'il n'a pas d'inclure gardes!). Il ne se comporte pas exactement comme une macro, mais il peut atteindre quelques jolies macro-comme résultats, depuis #include fondamentalement juste vide le contenu d'un fichier à l'autre.
Par exemple, envisager d'inclure des lots de même nom en-têtes de groupes. Il est fastidieux de les écrire, ou peut-être même qu'ils sont auto-générés. Vous pouvez automatiser en partie leur inclusion en faisant quelque chose comme ceci:
Les macros d'assistance en-tête:
Pseudo-fichier de macro
Fichier Source
Ces inclut pourrait même être dans le milieu de codes de blocs que vous souhaitez répéter (avec FOO modifié), comme la réponse par Bing Jian demandes: définition de macro contenant de la directive #include
Je n'ai pas utilisé cette astuce largement, mais c'est mon travail. Il peut évidemment être étendue à autant de "paramètres" en tant que de besoin, et vous pouvez exécuter n'importe quelle préprocesseur commandes vous là-dedans, ainsi que de générer le code réel. Vous ne pouvez pas utiliser les trucs qu'il crée comme l'entrée dans une autre macro, comme vous le pouvez avec la normale macros, puisque vous ne pouvez pas coller l'inclure à l'intérieur d'une macro. Mais il peut aller à l'intérieur un autre pseudo-macro :).
Autres pourraient avoir certains commentaires sur d'autres limitations, et de ce qui pourrait aller mal :).
Je ne vais pas argumenter le bien-fondé, mais freetype (www.freetype.org) effectue les opérations suivantes:
où ils définissent FT_FREETYPE_H ailleurs
Langages C et C++ interdire explicitement formant les directives de préprocesseur comme le résultat de l'expansion des macros. Cela signifie que vous ne pouvez pas inclure une directive de préprocesseur dans une macro liste de remplacement. Et si vous essayez de tromper le préprocesseur par "construire" une nouvelle directive de préprocesseur par concaténation (et des trucs comme ça), le comportement est indéfini.
Je crois que le préprocesseur C/C++ seulement un seul passage sur le code, donc je ne pense pas que cela fonctionnerait. Vous pourriez être en mesure d'obtenir un "#include" à placer dans le code par la macro, mais le compilateur pourrait s'étouffer, car il ne sait pas quoi faire avec ça. Pour ce que vous essayez de faire fonctionner le préprocesseur aurait à faire un deuxième passage sur le fichier afin de ramasser le #include.
J'ai aussi voulu faire cela, et en voici la raison:
Certains fichiers d'en-tête (notamment mpi.h dans OpenMPI) fonctionnent différemment si vous êtes à la compilation en C ou C++. Je suis un lien vers un C MPI le code de mon programme en C++. Inclure l'en-tête, je ne l'habituel:
Mais cela ne fonctionne pas parce que
__cplusplus
est encore défini, même dans une liaison C. Cela signifie que mpi.h, qui est inclus par bla.h, commence à la définition de modèles et le compilateur meurt en disant: vous ne pouvez pas utiliser des modèles avec une liaison C.Donc, ce que j'ai à faire dans bla.h est à remplacer
avec
Remarquablement ce n'est pas seulement mpi.h n'est ce pathologique chose. Donc, je veux définir une macro
INCLUDE_AS_C
qui ne le ci-dessus pour le fichier spécifié. Mais je suppose que ça ne fonctionne pas.Si quelqu'un peut comprendre d'une autre façon d'accomplir ceci, s'il vous plaît laissez-moi savoir.
Je pense que vous avez tous droit à cette tâche semble impossible, car j'ai aussi eu de
http://groups.google.com/group/comp.lang.c++/browse_thread/thread/03d20d234539a85c#
De toute façon, la raison derrière cette tentative, c'est que je suis en train de faire la suite
utilisé à plusieurs reprises extrait de code d'une macro:
Pour une autre tâche, j'ai besoin d'avoir une fonction similaire
où je vais placer
et bien sûr, il est dans "snippets/foo.cpp" et "snippets/bar.cpp" que la tâche spécifique de code est écrit.
Pourquoi la macro besoin d'avoir un #include? si vous êtes à la #include avec tout fichier de la macro, tu pourrais juste mettre le #include au-dessus de la macro avec tout le reste des instructions #include, et tout doit être beau et élégant.
Je ne vois pas de raison d'avoir de la macro d'inclure tout ce qui ne pouvait pas juste être inclus dans le fichier.
Je n'ai aucune idée de ce que vous êtes en train d'essayer de le faire, mais il ressemble à ce que vous voulez est basé sur un modèle de fonction.
De cette façon, le PixelType est juste un paramètre de modèle pour le bloc de code.
Contagieuse est juste, si vous êtes en train de faire:
myFile.c:
standardAppDefs.h:
Pourquoi ne pas simplement dire:
myFile.c:
standardAppDefs.h:
Et d'oublier les macros?