我刚刚调试了一个C程序很长一段时间,才发现我在进行函数调用时遗漏了一个参数,所以junk代替了缺少的参数。像这样愚蠢的错误确实令人沮丧,但我认为编译器应该能够检测到这一点。(C甚至不支持默认参数;即使在C++中,也需要显式声明默认参数。)
更新:原型也被发现是错误的。
那么,有没有一个警告函数调用参数号不匹配的GCC标志呢?我总是打开-Wall
和-pedantic
;如此明显的错误没有被检测到,这是相当令人惊讶的。(其实我想GCC不报道是有原因的,但我现在想不出有什么原因)
令人尴尬的代码示例:
static void dfs();
int main(int argc, const char *argv[]) {
dfs(1);
}
static void
dfs(int remain, int last) {
// dfs
}
我刚刚做的另一个发现是,如果原型包含参数,编译器将报告;但原型恰好不包含参数,那么编译器就会滑倒。
发布于 2013-03-31 13:01:21
函数调用参数的不匹配数量是所有编译器都将且必须提供的强制性诊断,而不需要任何特殊设置。它是由标准强制执行的。
C99Standard 6.5.2.2函数调用:
Constraints
如果表示被调用函数的表达式具有包含原型的类型,则参数的数量应与参数的数量一致。每个参数都应具有这样一种类型,即可以将其值赋给具有其相应参数类型的非限定版本的对象。
static void dfs();
告诉编译器dfs
是一个static
函数,它返回一个void
,并且可以接受未指定数量的参数。此外,您还为该函数提供了一个定义,该函数接受两个参数&调用相同的参数。如你所见,没有违约行为。问题是函数的声明不正确。如果你想声明一个不带参数的函数,你必须使用:
static void dfs(void);
一旦你这样做了,。
发布于 2013-03-31 13:35:18
您可以使用以下各种选项:
-Wstrict-prototypes
-Wmissing-prototypes
-Wold-style-definition
-Wold-style-declaration
即使你不使用-std=c99
或类似的东西,这些方法也能正常工作。我在办公室被古老的代码所困扰,当我清理一些没有得到“治疗”的代码时,我会使用这些(除了-Wstrict-prototypes
)。例外是因为代码库中指向函数的指针大多没有必要的参数列表。对于个人代码,或者我负责的代码,这不是问题。
https://stackoverflow.com/questions/15726506
复制相似问题