2012-09-08 31 views
5

Soy relativamente nuevo en C++ y estoy tomando una clase en él. A nuestra clase se le asignó un laboratorio y mi maestra dijo que la escritura del laboratorio es un poco difícil de entender; sin embargo, no realizó ningún cambio en la descripción del laboratorio. Por lo tanto, me encontré con esta parte de la práctica:Definición de un macro del preprocesador

Definición de un preprocesador de las macros

convenio independiente a largo capitaliza los nombres de macros, y esta macro debe ser TRACE_FUNC. La macro tiene un solo parámetro, un símbolo que será reemplazado por un nombre de función cuando aplique la macro al código. El inicio de la macro se parece a esto:

#define TRACE_FUNC(symbol) replacement-text` 

y el preprocesador sustituirá el texto de reemplazo de todo el mundo que existe la (SYM) TRACE_FUNC cadena en el código fuente, y alimentar el símbolo en que el reemplazo.

NOTA: la instrucción #define debe estar en una única línea lógica. Para mantener la longitud manejable, puede escapar del carácter de nueva línea con una barra invertida al final de la línea; eso mantendrá feliz al preprocesador y le permitirá abarcar una definición en múltiples líneas.

Para este ejercicio, el texto de reemplazo debe ser una declaración completa, incluido el punto y coma de terminación.

El texto de reemplazo debe ser una declaración de salida que imprime el símbolo seguido del texto() llamado. y una nueva línea para salida estándar. Puede copiar y modificar una de las declaraciones de salida del archivo fuente warning.cpp.

warning.cpp es solo un archivo que estamos usando y TRACE_FUNC se está colocando en un archivo de encabezado.

Por lo tanto, leo esto un par de veces y no estoy 100% seguro de lo que está pidiendo. Mirándolo de una manera, parece que me está pidiendo que cree una macro llamada TRACE_FUNC. Si lo miras de otra manera, me está pidiendo que use la macro TRACE_FUNC. Todo eso está bien, pero no sé cómo usar TRACE_FUNC en absoluto, no puedo encontrar ninguna documentación en él y no sé cómo crear una macro. Cuando pedí ayuda, mi maestra simplemente dijo algo. palabras y no muy útiles porque era una respuesta muy sinuosa y confusa sin explicación de lo que realmente es TRACE_FUNC.

Básicamente, todo lo que mi maestro dijo fue que el símbolo dentro de TRACE_FUNC debe ser el nombre de una de las funciones en el código fuente. Como ejemplo, digamos que teníamos una función foo() dentro de advertencia, entonces el símbolo se supone que es foo() (o foo, no estoy seguro de eso, tampoco), de su explicación. Además, en el texto de reemplazo, aparentemente el nombre en sí será reemplazado si puse # frente al símbolo. Pensé que eso suponía denotar las directivas del preprocesador. ¿Por qué se supone que debo usarlo aquí?

De todos modos, hacer lo que dice mi profesor casi no hace nada. Ni esta línea

#define TRACE_FUNC(foo()) #foo() called. ;

ni esta línea

#define TRACE_FUNC(foo) #foo() called. ;

reemplazar cualquier texto, que estoy bastante seguro de que es la operación de la directiva #define.De modo que debo aplicar lo que mi maestro dijo de la manera incorrecta, pero realmente no sé por qué está mal o cómo solucionarlo.

Entonces, mi pregunta. ¿Es realmente TRACE_FUNC una macro y, de ser así, hay documentación que pueda leer? ¿O se supone que debo crear TRACE_FUNC y, de ser así, cómo se supone que debo hacer eso exactamente?

Respuesta

6

¡Guau! ¡Qué basura! Se supone que debes aprender C++ correctamente, no intrincaciones del preprocesador.

Esto es lo que se supone que debes hacer, aunque nadie sabe por qué.

#define TRACE_FUNC(sym) std::cout << #sym << "() called\n" 

void foo() 
{ 
    TRACE_FUNC(foo); 
    ... 
} 

Estoy asumiendo que hay ejemplos de warning.cpp que utilizan std::cout si no, entonces usted tendrá que adaptar el anterior a lo que encuentre en warning.cpp.

La idea es que cada función comience con el uso de la macro TRACE_FUNC, para que pueda rastrear la ejecución de su código. Por qué el profesor cree que esta es una buena idea para los novatos está más allá de mí. Incluso si fuera una buena idea, que se espera que descubras los detalles es incluso más estúpido.

Podría mejorar la macro anterior, pero eso probablemente confundiría aún más, así que no lo haré. Por ahora solo haría lo que dice el profesor, pero ignóralo. Esperemos que se meta en cosas que vale la pena aprender más tarde.

+0

Gracias! Esto fue mucho más claro de lo que mi maestra estaba diciendo. – FoolishOrpheus

+0

Considere también http://stackoverflow.com/a/257425/1689451 sobre cómo definir macros de función. –

-1

aquí es un ejemplo: utilizar la función de impresión ouput en su libray para reemplazar la función printf estándar de aquí

#define TRACE_FUNC(sym) printf("%s() called", #sym); 

utilizarlo como

TRACE_FUNC(printf) 

la salida debe ser

printf() called 

su tarea real es imprimir un símbolo en un formato definido. entonces necesitas printf o una función similar en tu #define.

Cuestiones relacionadas