Препроцессор дампа GCC определяет

Существует ли путь к gcc/g ++ для дампа его препроцессора, определяет из командной строки? Я имею в виду вещи как __GNUC__, __STDC__, и так далее.

232
задан Brian Tompsett - 汤莱恩 6 July 2016 в 09:02
поделиться

2 ответа

Да, используйте параметры -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.

285
ответ дан 23 November 2019 в 03:34
поделиться

Я обычно делаю это следующим образом:

$ 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
77
ответ дан 23 November 2019 в 03:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: