Обработка одних директив, оставляя другие - PullRequest
7 голосов
/ 14 декабря 2010

Я использую, чтобы просмотреть код C , имеющий множество директив #ifdef, #if и #endif, которые поддерживают некоторую часть активной, а некоторую часть неактивной в зависимости от того, определены или нет определенные переменные.Я искал что-то, что могло бы обработать их для генерации окончательного C кода.Но предварительная обработка также делает то же самое для #include и #define.Но я хочу сохранить их.

Итак, есть ли какая-нибудь вещь, чтобы предварительно обработать эти файлы или спроектировать с некоторой фильтрацией?

Ответы [ 4 ]

2 голосов
/ 21 декабря 2010

Существует ряд программ, которые могут сделать это:

Я широко использовал sunifdef в очень искаженном коде и никогда не находил его ошибочным. Я готов начать использовать коан сейчас, хотя некоторое время он еще будет находиться под пристальным вниманием. Версия 4.2.2 была выпущена сегодня, 2010-12-20.

См. Также: SO 525283

0 голосов
/ 14 декабря 2010

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

0 голосов
/ 17 декабря 2010

Мы использовали собственный синтаксический анализатор для достижения того, что вы собираетесь делать. Lex & YACC будет хорошим началом для такого инструмента.

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

0 голосов
/ 14 декабря 2010

Я полагаю, вы используете gcc.

Если вы имеете в виду все #include s, я думаю, вам нужно удалить их, разверните полученный файл с помощью gcc -E, затем добавьте #includes s обратно.

Если вы имеете в виду только стандартные заголовки, опция -nostdinc может помочь вам сделать то, что вы хотите

user@host:~/test/tmp$ cat 4437465.c
#include <stdio.h>

#ifndef OUTPUT_TYPE
#define OUTPUT_TYPE 1
#endif

int main(void) {
#if OUTPUT_TYPE == 1
  printf("output type 1\n");
#elif OUTPUT_TYPE == 2
  printf("output type 2\n");
#else
  printf("default output type\n");
#endif
  return 0;
}
user@host:~/test/tmp$ gcc -DOUTPUT_TYPE=2 -nostdinc -E 4437465.c
# 1 "4437465.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "4437465.c"
4437465.c:1:19: error: no include path in which to search for stdio.h






int main(void) {



  printf("output type 2\n");



  return 0;
}
...