2011-03-02 4 views
10

Para una gran cantidad de llamadas a funciones en una aplicación C que necesita cierto grado de depuración, quería agregar una macro para facilitar la escritura que tenía que hacer.c/C++ (VS2008) encierre macro param entre comillas

en este momento yo estoy llamando a una función como esta:

aDebugFunction(&ptrToFunction, __LINE__, "ptrToFunction", param1, param2, etc) 

Así que pensé que le permite escribir una macro que hace los 3 primeros parámetros para mí, como este:

#define SOMEDEFINE(x) &x, __LINE__, "x" 

Sin embargo, como la mayoría de ustedes sabrá inmediatamente, esto no funcionará, no reemplazará "x" con el nombre que se le ha dado a x, sino que simplemente pasará "x" como tercer parámetro.

Mi conocimiento de este macroprocesador de anteprocesos es bastante limitado y, por lo tanto, mi capacidad para buscar en Google también es bastante inútil debido a que no sé dónde buscar exactamente.

Espero que uno de ustedes, muchachos/chicas, pueda darme una solución o señalarme en la dirección correcta.

Respuesta

11

Debe usar el token de conversión # para cadena del preprocesador. Debe definir su segunda macro de esta manera:

#define SOMEDEFINE(x) &x, __LINE__, # x 

O si x también puede ser una llamada a la macro, y desea que la cadena a contiene la expansión de la macro, es necesario utilizar una macro auxiliar:

#define TOKEN_TO_STRING(TOK) # TOK 
#define STRINGIZE_TOKEN(TOK) TOKEN_TO_STRING(TOK) 
#define SOMEDEFINE(x) &x, __LINE__, STRINGIZE_TOKEN(x) 

Por ejemplo, si usted tiene el siguiente código:

#define SHORT_NAME a_very_very_very_long_variable_name 
SOMEDEFINE(SHORT_NAME) 

Luego, con la primera macro, se expandirá a

&a_very_very_very_long_variable_name, __LINE__, "SHORT_NAME" 

Mientras, con la segunda macro, se expandirá a:

&a_very_very_very_long_variable_name, __LINE__, "a_very_very_very_long_variable_name" 
+0

¡gracias magnífico! –

1

En realidad se puede hacer mucho mejor que eso: #define SOMEDEFINE(X, ...) aDebugFunction(&(X), __LINE__, #X, __VA_ARGS__)

A continuación, puede simplemente llamar a este código como este : SOMEDEFINE(ptrToFunction, param1, param2, etc)
Y eso llamaría eficazmente: aDebugFunction(&(ptrToFunction), __LINE__, "ptrToFunction", param1, param2, etc)

Cuestiones relacionadas