2012-04-30 17 views
10

Possible Duplicate:
Creating C macro with ## and LINE (token concatenation with positioning macro)__LINE__ para diferentes nombres de variables

Estoy tratando de utilizar la macro __LINE__ para generar diferentes nombres de variables. Tengo una clase de referencia de referencia llamada Benchmark (ubicada en el espacio de nombres utils) y su constructor toma una cadena. Aquí está la definición de la macro que he creado:

#define BENCHMARK_SCOPE utils::Benchmark bm##__LINE__(std::string(__FUNCTION__)) 

Desafortunadamente esto hace que el siguiente error:

<some_file_name>(59): error C2374: 'bm__LINE__' : redefinition; multiple initialization

Esto me lleva a la conclusión de los __LINE__ macros no consigue expandieron. Creé mi macross según this post. ¿Tiene ideas de por qué __LINE__ no se expande?

EDIT: probablemente la información del compilador también sea relevante. Estoy utilizando Visual Studio 2010.

+0

Hmm. ¿Has probado 'bm ## __LINE__' (con un espacio)? – Cameron

+0

@Cameron Lo hice gracias a su comentario, pero nada ha cambiado. –

+0

Bien, un truco más para probar: '#define _BENCHMARK_SCOPE (línea) utils :: Benchmark bm ## línea (...' con '#define BENCHMARK_SCOPE _BENCHMARK_SCOPE (__ LINE__)' – Cameron

Respuesta

13

Es necesario utilizar una combinación de 2 macros:

#define COMBINE1(X,Y) X##Y // helper macro 
#define COMBINE(X,Y) COMBINE1(X,Y) 

y luego usarlo como,

COMBINE(x,__LINE__); 
+0

¿Tiene una idea de por qué necesito usar dos macros para eso? –

+1

@izomorphius, en realidad tu pregunta es un duplicado de otra, donde se explica muy bien. He comentado que para tu pregunta, por favor chequéalo. – iammilind

5

probar este código, lo he usado en un proyecto de mayor

#define CONCATENATE_DIRECT(s1, s2) s1##s2 
#define CONCATENATE(s1, s2) CONCATENATE_DIRECT(s1, s2) 
#ifdef _MSC_VER // Necessary for edit & continue in MS Visual C++. 
# define ANONYMOUS_VARIABLE(str) CONCATENATE(str, __COUNTER__) 
#else 
# define ANONYMOUS_VARIABLE(str) CONCATENATE(str, __LINE__) 
#endif 


int ANONYMOUS_VARIABLE(var) 

EDIT:

Creo que se debe utilizar CONTADOR en Visual Studio sólo si también usando encabezados precompilados.

+0

Funcionó con __LINE__ también. –

3

Estás usando pegar token. Esto ocurre antes de la expansión recursiva de macro (para que pueda token pegar para obtener el nombre de una macro que desea invocar). Por lo tanto:

#define PASTE(a,b) a ## b 

pegará los argumentos exactos pasaron a PASTE, a continuación, tratar de ampliar el nuevo token resultante. Para conseguir el efecto deseado, se necesita un nivel adicional de indirección:

#define PASTE_HELPER(a,b) a ## b 
#define PASTE(a,b) PASTE_HELPER(a,b) 

Aquí, los argumentos a PASTE se ampliará antes PASTE_HELPER es invocado.

Cuestiones relacionadas