может ли gcc выполнить тест, если в исходном файле существует определенный символ - PullRequest
0 голосов
/ 06 мая 2018

Возможно ли для gcc make проверить, существует ли определение в одном из исходных файлов, т. Е.

ifeq (DEFINED_BLAH_BLAH, 3) @echo невероятно похож на 3 еще @echo не равно 3 ENDIF

1 Ответ

0 голосов
/ 03 июня 2018

Я посмотрел на это и, чтобы потратить на предложение из комментария, вы могли бы сделать следующее. Не элегантно, вероятно, не лучшее доступное решение, но оно работает:

echo -ne "#if 1==MYVAL\n0\n#else\n1\n#endif\n" | cpp -P -imacros test.h

Или позвонить через gcc или g++:

echo -ne "#if 1==MYVAL\n0\n#else\n1\n#endif\n" | \
gcc -Xpreprocessor -P -E -imacros test.h -

Они будут возвращать стиль оболочки 0 (true для MYVAL, определенный в test.h и являющийся 1) или 1 на stdout, который можно проверить в make / shell.

Вы также можете удалить все пустые строки, добавляя | grep -v '^$'.

Более подробно об этом сказано Я создаю (echo) простой файл, который запускаю через препроцессор, который проверяет равенство для данного макроса и приводит к выводу 0 или 1. -P для cpp, потому что на самом деле это не файл C, и нам не нужны никакие дополнительные биты в выводе. -imacros означает сохранить макросы, определенные в этом файле, но отбросить все выходные данные, сгенерированные при его обработке.

Следует также отметить, что если у вас есть какие-либо условные определения, необходимые для рассмотрения любых определений, переданных компилятору, вам также необходимо передать их в этот cpp прогон.

Также обратите внимание, что test.h, являющийся вашим заголовочным файлом, должен включать определение макроса. Или main.c, будучи исходным файлом, включающим эти (и другие) заголовки, на самом деле не имеет значения / дает тот же результат (какое бы значение не было, когда cpp было сделано с файлом, прочитанным и (предварительно) обработанным для -imacros.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...