Cómo averiguar de cl.exe incorporados en las macros
-
01-10-2019 - |
Pregunta
¿Alguien sabe cómo podría averiguar qué son incorporadas / macros predefinidas de cl.exe? Por ejemplo, para gcc la siguiente línea de comandos mostrará una lista de todas las macros predefinidas del compilador
gcc -dM -E - </dev/null
EDIT:. Me interesa de una manera similar a la de GCC que es "pedir el compilador real"
Gracias
Solución
Este método hace cantidad a pedir el compilador de la lista de macros predefinidas, sino que utiliza características no documentadas y proporciona sólo una lista parcial. Lo incluyo aquí para completar.
El compilador de Microsoft C / C ++ permite un compilador de front-end alternativa a ser invocada mediante el / B1 y / línea de comandos Bx cambia para archivos .c .cpp respectivamente. El módulo de interfaz de línea de comandos cl.exe pasa una lista de opciones para el front-end de reemplazo compilador a través de la variable de entorno MSC_CMD_FLAGS. Esta lista de opciones incluye definiciones de macros -D para algunas de las macros predefinidas.
Los siguientes reemplazo trivial compilador de front-end imprime la lista de opciones que se le pasan:
/* 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;
}
Compilar esto a un ejecutable llamado, por ejemplo, "MyC1.exe", asegurarse de que es visible en el PATH y diga cl.exe para invocarlo como el front-end del compilador usando uno de los siguientes:
cl /B1MyC1.exe AnyNameHere.c
cl /BxMyC1.exe AnyNameHere.cpp
Incluir otras opciones de línea de comandos como sea necesario para ver qué macros están predefinidos para ese conjunto de opciones.
En el aspecto de salida resultante de las opciones -D. Una lista de ejemplo es la siguiente. En la salida real de la lista será, con cada definición de macro precedido por -D separados por espacios, y otras opciones también presente.
_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 que se incluyen la mayoría de las macros que dependen de las opciones de línea de comandos, pero excluye aquellos que siempre están definidos como __FILE__ y __DATE __.
Otros consejos
bandera /P
preprocesador emitirá las macros actualmente activos en base a los valores de creación del proyecto. No estoy seguro de si es exactamente el equivalente de comando gcc que ha mostrado. La salida está en el archivo .I
.
Obtener información en la fuente!
http://msdn.microsoft .com / es-es / library / b0084kay% 28v% = VS.90 29.aspx
PREDEF proyecto . Mantienen una base de datos de macros predefinidas para muchas plataformas de destino, plataformas de acogida y cadenas de herramientas del compilador.
También tienen un guión que intenta descubrir todos los nombres predefinidos ya sean documentados o no. Funciona mediante la ejecución de la utilidad strings
sobre el compilador, el procesamiento que para conseguir fichas candidato plausible, y tratando compilaciones de prueba para cada ficha. No es rápido, pero bastante bueno en descubrir un montón de macros.