El preprocesador de volcado GCC define
¿Hay alguna manera de que gcc/g++ descargue las definiciones de preprocesador predeterminadas desde la línea de comando? Me refiero a cosas como __GNUC__
, __STDC__
y así sucesivamente.
Sí, use opciones en lugar de -c . Ejemplo (los envía a la salida estándar):-E
-dM
echo | gcc -dM -E -
echo | clang -dM -E -
Para C++
echo | g++ -dM -E -x c++ -
echo | clang++ -dM -E -x c++ -
Del manual del CCG :
En lugar de la salida normal, genere una lista de directivas `#define' para todas las macros definidas durante la ejecución del preprocesador, incluidas las macros predefinidas. Esto le brinda una manera de descubrir qué está predefinido en su versión del preprocesador. Suponiendo que no tienes el archivo foo.h, el comando
touch foo.h; cpp -dM foo.h
mostrará todas las macros predefinidas.
Si utiliza -dM sin la opción -E, -dM se interpreta como sinónimo de -fdump-rtl-mach.
Normalmente lo hago de esta manera:
$ gcc -dM -E - < /dev/null
Tenga en cuenta que algunas definiciones del preprocesador dependen de las opciones de la línea de comando; puede probarlas agregando las opciones relevantes a la línea de comando anterior. Por ejemplo, para ver qué opciones SSE3/SSE4 están habilitadas de forma predeterminada:
$ gcc -dM -E - < /dev/null | grep SSE[34]
#define __SSE3__ 1
#define __SSSE3__ 1
y luego comparar esto cuando -msse4
se especifica:
$ gcc -dM -E -msse4 - < /dev/null | grep SSE[34]
#define __SSE3__ 1
#define __SSE4_1__ 1
#define __SSE4_2__ 1
#define __SSSE3__ 1
De manera similar, puede ver qué opciones difieren entre dos conjuntos diferentes de opciones de línea de comando, por ejemplo, comparar definiciones de preprocesador para niveles de optimización -O0
(ninguno) y -O3
(completo):
$ gcc -dM -E -O0 - < /dev/null > /tmp/O0.txt
$ gcc -dM -E -O3 - < /dev/null > /tmp/O3.txt
$ sdiff -s /tmp/O0.txt /tmp/O3.txt
#define __NO_INLINE__ 1 <
> #define __OPTIMIZE__ 1