为避免不可能的情况,可以将问题减少到两种情况。
案例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解析器)。问题是,是否有这样的工具?或者是否只有处理第一种情况的工具?或者根本没有?
答案 0 :(得分:1)
在C中,一切都可以(重新)定义,因此无法预先知道(重新)定义的内容。通常,一些命名约定有助于我们弄清楚什么是宏(如大写)。因此,不可能有这样的工具。当然,如果您认为编译错误是由缺少宏定义引起的,那么您可以使用它们来分析缺少的内容。