Запустите "легкий" препроцессор для GCC
Есть ли способ запустить препроцессор GCC, но только для пользовательских макросов?
У меня есть несколько однострочных и некоторые #ifdef
и т.д. условные выражения, и я хочу посмотреть, как выглядит мой код, когда просто расширяются.
Как и в случае, расширения include расширяются, my fprintf(stderr)
превращаются в fprintf(((__getreeent())->_stderr)
и т.д.
Ответы
Ответ 1
Вызовите cpp
напрямую, например
$ cat >foo.c <<EOF
#define FOO
#ifdef FOO
foo is defined
#else
foo is not defined
#endif
EOF
$ cpp foo.c
# 1 "foo.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "foo.c"
foo is defined
Конечно, если вы включаете заголовки, то они будут включены в вывод. Один из способов избежать этого может заключаться в том, чтобы просто grep -v
вывести строки с помощью #include
(или, возможно, только с #include <
и разрешить #include "
). Или вы можете указать параметр -nostdinc
для удаления только стандартных включений (но, возможно, оставить их в локальных библиотеках, если вы не укажете пути включения, чтобы они не были найдены), однако это предупреждало бы о недостающих заголовках.
Изменить: используйте сам препроцессор, чтобы сделать включение заголовков условным, оберните их чем-то вроде #ifndef TESTING_PREPROCESSOR
и используйте -DTESTING_PREPROCESSOR
.
Ответ 2
cpp -nostdinc program.c
Ответ 3
Можно использовать такие инструменты, как unifdef, unifdefall - удалить условные обозначения препроцессора из кода
Ответ 4
gcc -E inputfile.c > outputfile.c
outputfile.c будет иметь ваш предварительно обработанный код, но все макросы будут расширены.
Я считаю, что этот трюк очень полезен при отладке компиляции больших систем с множеством включений, флагов компилятора и переменных makefile. Он будет отображать включенные файлы, которые не имеют защитников заголовков, а также множество других проблем.