Así como los demás dicen, no, no puede tener declaraciones #include dentro de una macro, ya que el preprocesador solo hace una pasada. Sin embargo, puedes hacer que el preprocesador haga básicamente lo mismo con un truco retorcido que me encontré usando recientemente.
Tenga en cuenta que las directivas de preprocesador no harán nada dentro de una macro, sin embargo, HARÁN algo en un archivo. Por lo tanto, puede pegar un bloque de código que desea mutar en un archivo, pensando en ello como una definición de macro (con piezas que pueden ser alteradas por otras macros), y luego # incluir este archivo pseudo-macro en varios lugares (hacer ¡seguro que no tiene guardias incluidas!). No se comporta exactamente como lo haría una macro, pero puede lograr algunos resultados bastante similares a los macros, ya que #include básicamente solo descarga los contenidos de un archivo a otro.
Por ejemplo, considere incluir muchos encabezados de nombre similar que vienen en grupos. Es tedioso escribirlos todos, o tal vez incluso se generan automáticamente. Puede automatizar parcialmente su inclusión al hacer algo como esto:
ayudante macros de cabecera:
/* tools.hpp */
#ifndef __TOOLS_HPP__
#def __TOOLS_HPP__
// Macro for adding quotes
#define STRINGIFY(X) STRINGIFY2(X)
#define STRINGIFY2(X) #X
// Macros for concatenating tokens
#define CAT(X,Y) CAT2(X,Y)
#define CAT2(X,Y) X##Y
#define CAT_2 CAT
#define CAT_3(X,Y,Z) CAT(X,CAT(Y,Z))
#define CAT_4(A,X,Y,Z) CAT(A,CAT_3(X,Y,Z))
// etc...
#endif
archivo Pseudo-macro
/* pseudomacro.hpp */
#include "tools.hpp"
// NO INCLUDE GUARD ON PURPOSE
// Note especially FOO, which we can #define before #include-ing this file,
// in order to alter which files it will in turn #include.
// FOO fulfils the role of "parameter" in this pseudo-macro.
#define INCLUDE_FILE(HEAD,TAIL) STRINGIFY(CAT_3(HEAD,FOO,TAIL))
#include INCLUDE_FILE(head1,tail1.hpp) // expands to #head1FOOtail1.hpp
#include INCLUDE_FILE(head2,tail2.hpp)
#include INCLUDE_FILE(head3,tail3.hpp)
#include INCLUDE_FILE(head4,tail4.hpp)
// etc..
#undef INCLUDE_FILE
archivo Fuente
/* mainfile.cpp */
// Here we automate the including of groups of similarly named files
#define FOO _groupA_
#include "pseudomacro.hpp"
// "expands" to:
// #include "head1_groupA_tail1.hpp"
// #include "head2_groupA_tail2.hpp"
// #include "head3_groupA_tail3.hpp"
// #include "head4_groupA_tail4.hpp"
#undef FOO
#define FOO _groupB_
#include "pseudomacro.hpp"
// "expands" to:
// #include "head1_groupB_tail1.hpp"
// #include "head2_groupB_tail2.hpp"
// #include "head3_groupB_tail3.hpp"
// #include "head4_groupB_tail4.hpp"
#undef FOO
#define FOO _groupC_
#include "pseudomacro.hpp"
#undef FOO
// etc.
Estos incluye podía incluso estar en el medio de los bloques de códigos que desea repetir (con FOO alterado), como el haga clic en las solicitudes de Bing Jian: macro definition containing #include directive
No he utilizado este truco extensamente, pero hace mi trabajo. Obviamente se puede ampliar para tener tantos "parámetros" como sea necesario, y puede ejecutar los comandos de preprocesador que desee allí, además de generar el código real. Simplemente no puede usar lo que crea como entrada en otra macro, como puede hacerlo con las macros normales, ya que no puede pegar el include dentro de una macro. Pero puede ir dentro de otra pseudo macro :).
Otros pueden tener algunos comentarios sobre otras limitaciones, y qué podría salir mal :).
Probablemente deberías mirar las plantillas (como stbuton sugirió). Ciertamente deberías estar buscando evitar tener que hacer eso. –
como regla general, probablemente debas colocar todos tus enunciados #include en el mismo lugar (normalmente en la parte superior). hace que mantener y depurar su código sea mucho más simple. – helloandre
Tengo una forma un poco loca de hacer básicamente lo que quiere (usando el preprocesador); ver mi respuesta :) http://stackoverflow.com/a/27830271/1447953 –