是否有工具可以检查C文件所依赖的预定义宏?

时间:2016-12-09 07:01:10

标签: c c-preprocessor static-analysis

为避免不可能的情况,可以将问题减少到两种情况。

案例1

第一个(最简单)情况是预处理器有机会检测它,即有一个预处理器指令依赖于预定义的宏(在第一行输入之前定义)或不是。例如:

#ifdef FOO
#define BAR 42
#else
#define BAR 43
#endif

取决于FOO是否已预先定义。但是文件

#undef FOO

#ifdef FOO
#define BAR 42
#endif

没有。更难的情况是检测依赖性是否确实重要,在上述情况下它不会(因为FOOBAR都不会影响输出)。

案例2

第二种(更难)的情况是成功编译依赖于预定义的宏:

INLINE int fubar(void) {
    return 42;
}

就预处理器而言是否完全正确ENTRY_POINT是否已预定义,但除非INLINE被仔细定义,否则代码将无法编译。在这种情况下,我们可以类似地排除输出不受影响的情况,但我找不到一个例子。这里的复杂情况是示例:

int fubar(void) {
    return 42;
}

预定义的fubar可以改变对此的成功编译,因此可能需要将其限制为需要预定义符号才能成功编译的情况。

我猜这样的工具类似于预处理器(在第二种情况下是C解析器)。问题是,是否有这样的工具?或者是否只有处理第一种情况的工具?或者根本没有?

1 个答案:

答案 0 :(得分:1)

在C中,一切都可以(重新)定义,因此无法预先知道(重新)定义的内容。通常,一些命名约定有助于我们弄清楚什么是宏(如大写)。因此,不可能有这样的工具。当然,如果您认为编译错误是由缺少宏定义引起的,那么您可以使用它们来分析缺少的内容。