Существует ли путь к gcc/g ++ для дампа его препроцессора, определяет из командной строки? Я имею в виду вещи как __GNUC__
, __STDC__
, и так далее.
Да, используйте параметры -E -dM
вместо -c.
Пример (выводит их в стандартный вывод):
gcc -dM -E - < /dev/null
Для C ++
g++ -dM -E -x c++ - < /dev/null
Из руководства gcc :
Вместо обычного вывода сгенерируйте список директив `#define 'для всех макросов, определенных во время {{ 1}} выполнение препроцессора, включая предопределенные макросы. Это дает вам способ узнать, что предопределено в вашей версии препроцессора . Предполагая, что у вас нет файла foo.h, команда
touch foo.h; cpp -dM foo.h
покажет все предопределенные макросы.
Если вы используете -dM без опции -E, -dM интерпретируется как синоним -fdump-rtl-mach.
Я обычно делаю это следующим образом:
$ gcc -dM -E - < /dev/null
Обратите внимание, что некоторые определения препроцессора зависят от параметров командной строки - вы можете проверить их, добавив соответствующие параметры в указанную выше командную строку. Например, чтобы увидеть, какие параметры SSE3 / SSE4 включены по умолчанию:
$ gcc -dM -E - < /dev/null | grep SSE[34]
#define __SSE3__ 1
#define __SSSE3__ 1
, а затем сравнить это, когда указан -msse4
:
$ gcc -dM -E -msse4 - < /dev/null | grep SSE[34]
#define __SSE3__ 1
#define __SSE4_1__ 1
#define __SSE4_2__ 1
#define __SSSE3__ 1
Точно так же вы можете увидеть, какие параметры различаются между двумя разными наборами параметров командной строки, например, сравнить определения препроцессора для уровней оптимизации -O0
(нет) и -O3
(полный):
$ 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