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