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
Obtenga información en la fuente!
http://msdn.microsoft.com/en-us/library/b0084kay%28v=VS.90%29.aspx
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