¿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 - < NULse 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
-msse4se 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
-xargumento, por lo queg++ -x c++ -dM -E -std=c++11 - < /dev/null | grep cppdeberí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++11con 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-dDopció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
-dDopción.fuente
NUL, volverá al punto de partida: no funcionará en sistemas que no lo tengan.sortcomporta de manera un poco diferente):echo | gcc -x c++ -std=c++17 -dM -E - | sortMientras 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