2010-07-05 10 views
15

quiero definir una macro que incluye otro archivo de cabecera de este modo:# define para incluir otro archivo en C++/C

#define MY_MACRO (text) #include "__FILE__##_inline.inl" 

Así que cuando el preprocesador analiza Person.h archivo, MY_MACRO (blahblah) expande a

# include "person.h.inline.inl"

ninguna pista sobre cómo hacer esto?

+2

No es posible. – Philipp

Respuesta

14

No es posible utilizar #define para construir otras directivas de preprocesador, a menos que ejecute el preprocesador dos veces.

Pero en su caso, incluso ejecutar el preprocesador dos veces no ayudará porque el #include debe ser una sola cadena del formulario "..." o <...>.

+1

Esto es falso, he trabajado con código que hizo esto. Incluyeron el archivo varias veces, cada vez redefiniendo la macro antes de incluirla. Esto provocó que las macros se ejecutaran varias veces, una vez por incluir. El caso de uso que vi fue código C puro usando este truco para hacer pseudo-plantillas. –

+0

@GabeSechan Lo que describes se conoce comúnmente como X Macro. Pero no ejecuta el preprocesador varias veces. Redefine macros e incluye archivos varias veces. Es un truco realmente genial para algunos casos de uso. – woodtluk

3

No puede escribir otras directivas de preprocesador con el preprocesador. Sin embargo, creo que se podría definir el nombre del fichero:

#define MY_MACRO(name) "__FILE__##name_inline.inl" 

#include MY_MACRO(name) 

El pre-procesador ejecuta varias veces hasta que no hay más sustituciones que puede hacer, por lo que debe ampliar el nombre primero y luego # incluye el archivo referenciado .

EDIT: Acabo de probarlo y el preprocesador no puede manejar las citas de esa manera.

#define MY_MACRO(x) <__FILE__##x_inline.inl> 
#include MY_MACRO(foo) 

funciona bien, pero <> puede no ser lo que quería.

EDIT2: Como se señala en los comentarios, el __FILE__ no se expande correctamente, lo que hace que esto probablemente no sea lo que usted desea después de todo. Lo siento.

+1

http://codepad.org/AxNh2h3F Aparentemente '" __FILE __ ## name_inline.inl "' se trata literalmente, pero si lo cambia a '#define a MY_MACRO (nombre) <__ FILE__ ## nombre ## _inline.inl>' entonces usted * puede * realmente incluir un archivo de forma variable. –

+0

No creo que esto funcione en absoluto. La macro que proporciones se expande a '<__ FILE__x_inline.inl>', mientras que debería ser algo como ''. – sth

+0

@sth: Tienes razón, me lo perdí. He intentado romper hacia abajo a dos etapas, así: [code] #define MY_MACRO (a) ## __FILE__ un #define MY_MACRO_2 (b) # include MY_MACRO_2 (prueba) [/ code] pero eso tampoco ayuda. – Vicky

9

No puede usar __FILE__ porque eso ya está citado, y #include no admite la concatenación de cadenas. Pero se puede utilizar macros después de #include:

#define STRINGIZE_AUX(a) #a 
#define STRINGIZE(a) STRINGIZE_AUX(a) 
#define CAT_AUX(a, b) a##b 
#define CAT(a, b) CAT_AUX(a, b) 
#define MY_MACRO(file, name) STRINGIZE(CAT(file, CAT(name, _inline.inl))) 
#include MY_MACRO(aaaa, qqq) 

usted debe utilizar las macros Boost.Preprocessor equivalentes en lugar de CAT y STRINGIZE para evitar la contaminación del espacio de nombres global.

+0

+1 No estoy seguro de si es muy feo o muy bonito, pero parece funcionar ... – Tomas

+0

Sí, sí logra incluir el archivo, pero aún tengo que usar un #include por separado, y también parece que __FILE__ es ampliado a una cadena entre comillas, por lo que puede ser que esto no sea posible en absoluto. –

+0

Sí, es realmente imposible. Intenta rediseñar tu aplicación para que no sea necesaria. – Philipp

-5
#if 0 /*Windows*/ 
#define MKDIR_ENABLER <direct.h> 
#define MY_MKDIR(x,y) _mkdir((x)) 
#else /*Linux*/ 
#define MKDIR_ENABLER <sys/stat.h> 
#define MY_MKDIR(x,y) mkdir((x),(y)) 
#endif 

#include MKDIR_ENABLER 

int main(void) 
{ 
    MY_MKDIR("more_bla",0644); 
    return 0; 
} 

Este código incluye el fichero de cabecera apropiado para mkdir (porque es diferente en UNIX y Windows) e introduce un bonito envoltorio para ello.

+0

¿Y de qué manera esto está dando una respuesta? – dhein

Cuestiones relacionadas