2012-02-01 13 views
9

¿Es posible concatenar cadena de otra macro cuando #incluye un nombre de archivo (en C). Por ejemplo,Concatenar cadena en C# incluir nombre de archivo

tengo,

#define AA 10 
#define BB 20 

estos son parámetros que cambian con el programa se ejecuta

y el archivo son:

#include "file_10_20" // this changes correspondingly i.e. file_AA_BB 

¿Es posible tener algo como #include "file_AA_BB" alguna manera ? Busqué en Google para encontrar ese operador de doble libra puede concat cadenas, pero no pudo encontrar una manera de hacerlo.

Cualquier ayuda sería apreciada.

+0

intente '#include # (archivo _ ## AA ## _ ## BB)' – asaelr

Respuesta

16

principio pensé "eso es fácil", pero lo hizo tomar algunos intentos de averiguar:

#define AA 10 
#define BB 20 

#define stringify(x) #x 
#define FILE2(a, b) stringify(file_ ## a ## _ ## b) 
#define FILE(a, b) FILE2(a, b) 

#include FILE(AA, BB) 

conforme a lo solicitado Voy a tratar de explicar. FILE(AA, BB) se expande a FILE2(AA, BB) pero luego AA y BB se expande antes de FILE2, por lo que la siguiente expansión es FILE2(10, 20) que se expande a stringify(file_10_20) que se convierte en la cadena.

Si omite FILE2, terminará con stringify(file_AA_BB) que no funcionará. El estándar C en realidad pasa varias páginas definiendo cómo se hace la expansión de macros. En mi experiencia, la mejor manera de pensar es "si no hubo suficiente expansión, agregue otra capa de define"

Sólo enrojecidamente no funcionará porque el # se aplica antes de que AA se sustituya por 10. Así es como generalmente quiere en realidad, por ejemplo:

#define debugint(x) warnx(#x " = %d", x) 
debugint(AA); 

imprimirá

AA = 10 
+0

Si puede explicarme por qué es necesaria la macro ARCHIVO voy a votar mejor ;-). Ya he visto muchos de estos constructos y nunca entendí por qué solo 2 macros no funcionan o incluso por qué la respuesta de Asael no funciona. Estoy muy interesado en saber cómo funciona el preprocesador en su ejemplo. ¿Alguien puede explicar? – Artur

+1

No te olvides de #undef FILE, porque colisionará con algo en wildplasser

+0

Correcto, quizás no sea la mejor opción para el nombre de macro. –

5

se utiliza generalmente como esto:

#define stringify(x) #x 
#define expand_and_stringify(x) stringify(x) 

#define AA 10 
#define BB 20 

#define TEXT1 "AA = " stringify(AA) " BB = " stringify(BB) 
#define TEXT2 "AA = " expand_and_stringify(AA) " BB = " expand_and_stringify(BB) 

TEXT1 = "AA = AA BB = BB" 
TEXT2 = "AA = 10 BB = 20" 

Se llama stringification. Debería marcar this answer.

+0

¿No se supone que esto no debe funcionar para una declaración de inclusión? Consulte http://stackoverflow.com/questions/20524491/preprocessor-concatenation-for-include-path/20524959#20524959 y http://stackoverflow.com/questions/39038867/string-concatenation-for-include-path – Antonio

Cuestiones relacionadas