Есть ли способ для gcc / g ++ выгружать свои определения препроцессора из командной строки? Я имею в виду такие вещи , как __GNUC__
, __STDC__
и так далее.
gcc
g++
c-preprocessor
Anycorn
источник
источник
echo | gcc -dM -E -
работает и на windows.cpp -dM -E - < NUL
могут быть использованы.Я обычно делаю это так:
Обратите внимание, что некоторые определения препроцессора зависят от параметров командной строки - вы можете проверить их, добавив соответствующие параметры в приведенную выше командную строку. Например, чтобы увидеть, какие опции SSE3 / SSE4 включены по умолчанию:
и затем сравните это, когда
-msse4
указано:Точно так же вы можете увидеть, какие параметры отличаются между двумя различными наборами параметров командной строки, например, сравнение препроцессора для уровней оптимизации
-O0
(нет) и-O3
(полное):источник
Поздний ответ - я нашел другие ответы полезными - и хотел добавить немного больше.
Как вывести дамп макроса препроцессора из определенного заголовочного файла?
или (спасибо @mymedia за предложение):
В частности, я хотел посмотреть, что SOMAXCONN было определено в моей системе. Я знаю, что могу просто открыть стандартный файл заголовка, но иногда мне нужно немного поискать, чтобы найти расположение файла заголовка. Вместо этого я могу просто использовать эту строку:
источник
Простой подход (
gcc -dM -E - < /dev/null
) прекрасно работает для gcc, но не работает для g ++. Недавно мне потребовался тест для функции C ++ 11 / C ++ 14. Рекомендации по соответствующим именам макросов опубликованы по адресу https://isocpp.org/std/standing-documents/sd-6-sg10-feature-test-recommendations . Но:всегда терпит неудачу, потому что он молча вызывает C-драйверы (как если бы они вызывались
gcc
). Вы можете убедиться в этом, сравнив его вывод с выводом gcc или добавив параметр командной строки, специфичный для g ++, например (-std = c ++ 11), который выдает сообщение об ошибкеcc1: warning: command line option ‘-std=c++11’ is valid for C++/ObjC++ but not for C
.Поскольку (не C ++) gcc никогда не будет поддерживать «Псевдонимы шаблонов» (см. Http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2258.pdf ), вы должны добавить
-x c++
опцию в Принудительный вызов компилятора C ++ (Кредиты для использования-x c++
опций вместо пустого пустого файла идут в yuyichao, см. ниже):Вывод не будет, потому что g ++ (ревизия 4.9.1, по умолчанию -std = gnu ++ 98) не включает функции C ++ 11 по умолчанию. Для этого используйте
что в итоге дает
отмечая, что g ++ 4.9.1 поддерживает «псевдонимы шаблонов» при вызове с
-std=c++11
.источник
-x
аргумент, поэтомуg++ -x c++ -dM -E -std=c++11 - < /dev/null | grep cpp
должен работать.Переносимый подход, который одинаково хорошо работает в Linux или Windows (где нет / dev / null):
Для c ++ вы можете использовать (замените
c++11
на любую версию, которую вы используете):Он работает, сообщая gcc препроцессору stdin (который создается echo) и печатает все определения препроцессора (поиск
-dletters
). Если вы хотите знать, какие определения добавляются, когда вы включаете заголовочный файл, вы можете использовать-dD
опцию, которая похожа на -dM, но не включает предопределенные макросы:Обратите внимание, однако, что пустой ввод по-прежнему производит много определений с
-dD
опцией.источник
NUL
, вы вернетесь к исходной точке: он не будет работать в системах, в которых его нет.sort
ведет себя немного иначе):echo | gcc -x c++ -std=c++17 -dM -E - | sort
Работая в большом проекте, который имеет сложную систему сборки и где трудно получить (или изменить) команду gcc / g ++ напрямую, есть другой способ увидеть результат раскрытия макроса. Просто переопределите макрос, и вы получите вывод, похожий на следующий:
источник