为了避免不可能的情况,人们可以将问题减少到两种情况下。
情况1
第一种情况(最简单)的情况是预处理器有机会检测它,即有一个预处理器指令取决于预定义的宏(在第一条输入之前定义)。例如:
#ifdef FOO
#define BAR 42
#else
#define BAR 43
#endif
取决于FOO
是否是预定义的。但是文件
#undef FOO
#ifdef FOO
#define BAR 42
#endif
没有。一个困难的情况是检测依赖性是否确实很重要,而在上述情况下却不重要(因为FOO
或BAR
都不会影响输出)。
情况2
第二个(更难)的情况是成功编译取决于预定义的宏:
INLINE int fubar(void) {
return 42;
}
就预处理器而言,这是完全很好的,ENTRY_POINT
是否是预定义的,但是除非仔细定义INLINE
,否则代码不会编译。类似地,在这种情况下,我们可以排除不影响输出的情况,但我找不到一个例子。这里的并发症是在示例中:
int fubar(void) {
return 42;
}
预定义的fubar
可以更改其成功的汇编,因此可能需要将其限制为需要预定义才能成功编译的情况。
我想这样的工具将类似于预处理器(第二种情况下的C解析器)。问题是是否有这样的工具?还是只能处理第一种情况的工具?还是根本没有?
在c中的所有内容都可以(重新)定义,因此无法事先知道要定义的内容。通常,某些命名约定可以帮助我们弄清楚是宏观的含义(例如上案例)。因此,不可能拥有这种工具。当然,如果您假设汇编错误是由于缺少宏定义引起的,那么您可以使用它们来分析缺少的内容。