4

我正在使用包含许多编译选项的复杂 C 代码。这使得代码很难阅读。我想生成一份反映其实际编译方式的代码副本。我使用“unifdef”实用程序获得了相当不错的结果,直到最近我才知道。但是,我很困惑为什么它如此难以调用,并且想知道我是否遗漏了一些东西。

考虑这个例子:

#ifdef A
  printf("A\n");
#endif
#ifdef B
  printf("B\n");
#endif

如果你用“unifdef -DA junk.c”调用 unifdef,你会得到:

  printf("A\n");
#ifdef B
  printf("B\n");
#endif

因为您没有告诉 unifdef B 未定义,所以它没有将其取出。

我希望该实用程序的行为使得当我说 unifdef -DA 时,我得到的是:

  printf("A\n");

这将对应于 C 预处理器的实际操作:省略任何未定义的分支。

要使用 unifdef 获得这种行为,我似乎需要使用“unifdef -DA -UB junk.c”,明确告诉它 B 未定义。虽然也许我错过了一种更简单的调用它的方法。

我编写了一个 python 脚本来从我正在使用的代码的 Makefile 中生成一长串所需的 -D 和 -U 标志(通常每个例程 80 个)。结果非常好。但我想知道这样的脚本是否真的有必要。

另一个实用程序(sunifdef?coan?)也可能已经内置了我想要的行为;如果有,请提及。

4

3 回答 3

8

coan实用程序可以使用-m标志满足您的需求:

$ coan source -DA -m test.c 
  printf("A\n");

从手册页:

-m, --implicit
    Assume that any symbol that is not --define-ed is implicitly
    --undef-ed.
于 2013-01-24T00:55:12.063 回答
4

您可以使用 unifdef 附带的 unifdefall 实用程序。见http://dotat.at/prog/unifdef

于 2013-04-11T10:48:01.623 回答
1

如果我正确理解了您的问题,您想在预处理器运行后查看代码,对吗?那么为什么不让预处理器运行它并查看它产生的输出呢?只需使用与编译时完全相同的参数运行编译调用,但将参数添加-E到其中,这意味着“除了预处理之外什么都不做”。

$ cat preproc.c 
#ifdef A
  printf("A\n");
#endif
#ifdef B
  printf("B\n");
#endif

$ gcc -E preproc.c 
# 1 "preproc.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "preproc.c"

$ gcc -E -DA preproc.c 
# 1 "preproc.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "preproc.c"

  printf("A\n");

$ gcc -E -DB preproc.c
# 1 "preproc.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "preproc.c"




  printf("B\n");

$
于 2013-01-24T00:03:18.307 回答