¿Hay alguna manera para que gcc / g ++ descargue su preprocesador definido desde la línea de comando? Me refiero a cosas como __GNUC__
, __STDC__
etc.
gcc
g++
c-preprocessor
Cualquier maíz
fuente
fuente
echo | gcc -dM -E -
funciona en Windows.cpp -dM -E - < NUL
se puede utilizar.Usualmente lo hago de esta manera:
Tenga en cuenta que algunas definiciones de preprocesador dependen de las opciones de la línea de comandos; puede probarlas agregando las opciones relevantes a la línea de comandos anterior. Por ejemplo, para ver qué opciones SSE3 / SSE4 están habilitadas de manera predeterminada:
y luego compara esto cuando
-msse4
se especifica:De forma similar, puede ver qué opciones difieren entre dos conjuntos diferentes de opciones de línea de comandos, por ejemplo, comparar definiciones de preprocesador para niveles de optimización
-O0
(ninguno) y-O3
(completo):fuente
Respuesta tardía: las otras respuestas me parecieron útiles, y quería agregar un poco más.
¿Cómo vuelco las macros de preprocesador que provienen de un archivo de encabezado particular?
o (gracias a @mymedia por la sugerencia):
En particular, quería ver qué SOMAXCONN estaba definido en mi sistema. Sé que podría abrir el archivo de encabezado estándar, pero a veces tengo que buscar un poco para encontrar las ubicaciones del archivo de encabezado. En cambio, solo puedo usar esta línea:
fuente
El enfoque simple (
gcc -dM -E - < /dev/null
) funciona bien para gcc pero falla para g ++. Recientemente solicité una prueba para una función C ++ 11 / C ++ 14. Las recomendaciones para sus nombres de macro correspondientes se publican en https://isocpp.org/std/standing-documents/sd-6-sg10-feature-test-recommendations . Pero:siempre falla, porque invoca silenciosamente los controladores C (como si los invocara
gcc
). Puede ver esto comparando su salida con la de gcc o agregando una opción de línea de comando específica de g ++ como (-std = c ++ 11) que emite el mensaje de errorcc1: warning: command line option ‘-std=c++11’ is valid for C++/ObjC++ but not for C
.Debido a que el gcc (que no es C ++) nunca admitirá "Alias de plantillas" (consulte http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2258.pdf ) debe agregar la
-x c++
opción a forzar la invocación del compilador de C ++ (los créditos para usar las-x c++
opciones en lugar de un archivo ficticio vacío van a yuyichao, ver a continuación):No habrá salida porque g ++ (revisión 4.9.1, por defecto es -std = gnu ++ 98) no habilita las funciones de C ++ 11 de manera predeterminada. Para hacerlo, use
que finalmente rinde
observando que g ++ 4.9.1 admite "Alias de plantillas" cuando se invoca con
-std=c++11
.fuente
-x
argumento, por lo queg++ -x c++ -dM -E -std=c++11 - < /dev/null | grep cpp
debería funcionar.Un enfoque portátil que funciona igualmente bien en Linux o Windows (donde no hay / dev / null):
Para c ++ puede usar (reemplazar
c++11
con cualquier versión que use):Funciona diciéndole a gcc que preprocese stdin (que se produce por echo) e imprima todas las definiciones de preprocesador (búsqueda
-dletters
). Si desea saber qué definiciones se agregan cuando incluye un archivo de encabezado, puede usar la-dD
opción que es similar a -dM pero no incluye macros predefinidas:Sin embargo, tenga en cuenta que la entrada vacía aún produce muchas definiciones con la
-dD
opción.fuente
NUL
, volverá al punto de partida: no funcionará en sistemas que no lo tengan.sort
comporta de manera un poco diferente):echo | gcc -x c++ -std=c++17 -dM -E - | sort
Mientras trabaja en un gran proyecto que tiene un sistema de compilación complejo y donde es difícil obtener (o modificar) el comando gcc / g ++ directamente, hay otra forma de ver el resultado de la expansión de macros. Simplemente redefina la macro y obtendrá un resultado similar al siguiente:
fuente