Запустить «легкий» препроцессор для GCC - PullRequest
14 голосов
/ 11 апреля 2010

Есть ли способ запустить препроцессор GCC , но только для пользовательских макросов?

У меня есть несколько однострочных и несколько #ifdef и т. Д. Условных обозначений, и я хочу посмотреть, как выглядит мой код, когда только они расширяются.

Как есть, расширения включаются, мои fprintf(stderr) s превращаются в fprintf(((__getreeent())->_stderr) и т. Д.

Ответы [ 4 ]

14 голосов
/ 11 апреля 2010

Позвоните 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.

3 голосов
/ 18 апреля 2013

Можно использовать такие инструменты, как unifdef, unifdefall - удалить условные выражения препроцессора из кода

3 голосов
/ 11 апреля 2010
cpp -nostdinc program.c
1 голос
/ 11 апреля 2010
gcc  -E inputfile.c > outputfile.c

outputfile.c будет иметь ваш предварительно обработанный код, но все макросы будут расширены.

Я считаю этот прием очень полезным при отладке компиляции больших систем с тоннами включений, флагов компилятора и переменных makefile. Он покажет включаемые файлы, которые не имеют защиты заголовка, и кучу других проблем.

...