Запустите "легкий" препроцессор для 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. Он будет отображать включенные файлы, которые не имеют защитников заголовков, а также множество других проблем.