我正在使用包含许多编译选项的复杂 C 代码。这
使代码很难阅读。我想生成一份反射(reflect)代码的副本
它实际编译的方式。我使用“unifdef”得到了很好的结果
实用程序,直到最近我才知道。然而,我不明白为什么这么难
调用,我想知道我是否遗漏了什么。

考虑这个例子:

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

如果你用“unifdef -DAjunk.c”调用unifdef,你会得到:
  printf("A\n");
#ifdef B
  printf("B\n");
#endif

因为你没有告诉 unifdef B 是未定义的,所以它没有把它取出来。

我希望实用程序的行为是这样的,当我说 unifdef -DA 时,我得到:
  printf("A\n");

这将对应于 C 预处理器实际在做什么:
任何未定义的分支都被省略。

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

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

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

最佳答案

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.

关于c - 使用unifdef默认省略未定义的预处理器分支的方法?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14491555/

10-11 18:45