2012-07-30 16 views
6

En el archivo .cpp utilizo una macro mmData1. Busqué en el proyecto y veo que esta macro está definida en varios archivos (es decir, hay varios archivos .h que tienen la línea #define mmData1)Preprocesador en proyecto visual 2010-C++ proyecto

quiero saber si hay una capacidad en VS10 para comprobar de qué archivo del preprocesador toma el valor de la macro

+0

Creo que puede ir a la ubicación donde _utiliza_ la macro y hacer clic con el botón derecho en el nombre de la macro. El menú emergente tiene las opciones "Ir a definición" y "Ir a declaración". Uno de esos debería funcionar, no recuerdo cuál. – Blastfurnace

+0

@ Blastfurnace-no funciona "símbolo mmData1 no se pudo ubicar" – Yakov

+0

@Blastfurnace nah, intellisense no hace mucho en este caso. Probablemente obtenga una lista de definiciones, no la que usa. –

Respuesta

4

Si Intellisense no sabe, entonces no hay manera directa. Sin embargo, hay formas indirectas. Digamos que su nombre de macro es SOME_MACRO

  1. Después de cada instancia de #define SOME_MACRO puso #error Defined here, a continuación, haga clic derecho en el archivo de origen y seleccione Compile. Si el compilador devuelve un error, elimine la directiva que lo genera y vuelva a compilar. La última instancia de este error alineará la definición visible en la fuente.

  2. Haga cada directiva que define SOME_MACRO lo definen como algo más y luego, en el archivo de origen, agregue estas líneas después de todo, incluye:

    #define STRINGIZE(x) STRINGIZE2(x) 
    #define STRINGIZE2(x) #x 
    #pragma message("SOME_MACRO is expanded as: " STRINGIZE(SOME_MACRO)) 
    

    compilar el archivo fuente; debería ver el valor en el registro de compilación.

  3. manera menos intrusiva: poner esas líneas después de cada #define SOME_MACRO

    #pragma push_macro("STRINGIZE") 
    #pragma push_macro("STRINGIZE2") 
    #define STRINGIZE(x) STRINGIZE2(x) 
    #define STRINGIZE2(x) #x 
    #pragma message("Defining at " __FILE__ ":" STRINGIZE(__LINE__)) 
    #pragma pop_macro("STRINGIZE") 
    #pragma pop_macro("STRINGIZE2") 
    

    O, si usted no necesita el número de línea:

    #pragma message("Defining at " __FILE__) 
    

    compilar el archivo. En cuanto al registro de compilación, debe poder indicar el orden de las definiciones SOME_MACRO.

+0

+1 para el último. –

1

La mejor manera de ver exactamente lo que el preprocesador está haciendo es inspect its output directly. Intellisense es útil, pero a menudo no coincide con lo entiende el compilador.

0

Un truco simple que siempre uso es redefinir la macro en la línea que desea verificar. Cuando compila el código, el preprocesador se quejará y le dirá dónde estaba la definición anterior.

Ejemplo:

test.cpp contiene:

#include "test.h" 

int main() 
{ 
    #define SOMEMACRO 1 
    return 0; 
} 

test.h contiene:

#define SOMEMACRO 2 
int foo(); 

al compilar test.cpp, me sale este mensaje de error:

test.cpp:5:0: warning: "SOMEMACRO" redefined [enabled by default] 
In file included from test.cpp:1:0: 
test.h:1:0: note: this is the location of the previous definition 

He probado en GC C, pero Visual Studio hace lo mismo.

Cuestiones relacionadas