c++ c visual-c++ macros cl

c++ - Cómo descubrir las macros incorporadas de cl.exe



visual-c++ (4)

Este método equivale a pedirle al compilador la lista de macros predefinidas, pero utiliza características no documentadas y proporciona solo una lista parcial. Lo incluyo aquí para completar.

El compilador Microsoft C / C ++ permite invocar un front-end de compilador alternativo utilizando los modificadores de línea de comandos / B1 y / Bx para los archivos .c y .cpp respectivamente. El módulo de interfaz de línea de comandos CL.exe pasa una lista de opciones al front-end del compilador de reemplazo a través de la variable de entorno MSC_CMD_FLAGS. Esta lista de opciones incluye definiciones de macro -D para algunas de las macros predefinidas.

El siguiente front-end del compilador de reemplazo trivial imprime la lista de opciones pasadas:

/* MyC1.c */ #include <stdio.h> #include <stdlib.h> int main(void) { char *p; if ((p = getenv("MSC_CMD_FLAGS")) != NULL) printf("MSC_CMD_FLAGS:/n%s/n", p); if ((p = getenv("MSC_IDE_FLAGS")) != NULL) printf("MSC_IDE_FLAGS:/n%s/n", p); return EXIT_FAILURE; }

Compile esto en un ejecutable llamado, por ejemplo, "MyC1.exe", asegúrese de que esté visible en la RUTA y diga a CL.exe que lo invoque como el extremo frontal del compilador usando uno de los siguientes:

cl /B1MyC1.exe AnyNameHere.c cl /BxMyC1.exe AnyNameHere.cpp

Incluya otras opciones de línea de comandos según sea necesario para ver qué macros están predefinidas para ese conjunto de opciones.

En la salida resultante busque las opciones -D. Una lista de ejemplo se da a continuación. En la salida real, la lista estará separada por espacios, con cada definición de macro precedida por -D, y otras opciones también estarán presentes.

_MSC_EXTENSIONS _INTEGRAL_MAX_BITS=64 _MSC_VER=1600 _MSC_FULL_VER=160030319 _MSC_BUILD=1 _WIN32 _M_IX86=600 _M_IX86_FP=0 _MT

Esta técnica parece incluir la mayoría de las macros que dependen de las opciones de la línea de comandos, pero excluye aquellas que siempre están definidas, como __FILE__ y __DATE__.

¿Alguien sabe cómo puedo averiguar cuáles son las macros predefinidas / integradas de cl.exe? Por ejemplo, para gcc, la siguiente línea de comando mostrará una lista de todas las macros integradas del compilador

gcc -dM -E - </dev/null

EDITAR: Estoy interesado en una forma similar a la de gcc que es "preguntar al compilador real".

Gracias



Prueba el proyecto predefinido . Mantienen una base de datos de macros predefinidas para muchas plataformas de destino, plataformas de host y cadenas de herramientas de compilación.

También tienen un script que intenta descubrir todos los nombres predefinidos ya sea que estén documentados o no. Funciona ejecutando la utilidad de strings sobre el compilador, procesando eso para obtener tokens candidatos plausibles y probando compilaciones de prueba para cada token. No rápido, pero bastante bueno en descubrir muchas macros.


/P indicador de preprocesador /P emitirá las macros actualmente activas según la configuración de compilación del proyecto. No estoy seguro de si es exactamente el equivalente al comando gcc que has mostrado. La salida está en el archivo .I