我只是调试一个C程序很长一段时间,才发现我做一个函数调用时没有参数,所以垃圾,而不是填补缺少的参数。 这样愚蠢的错误是很无奈,但我想编制者应能够检测到这一点。 (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
}
我只是做了另一个发现是,如果原型包含参数,编译器将报告; 但原型发生在不包含参数,那么编译器只是滑倒。
函数调用的参数不匹配的号码是强制性的诊断,所有的编译器都必须提供没有任何特殊的设置。 它是由标准的规定。
C99Standard 6.5.2.2函数调用:
约束
如果它表示所调用的函数的表达有一个类型,其包括一个原型,参数的数目应的参数的数量一致。 每个参数应具有这样的类型,它的值可以被分配给对象与其相应的参数的类型的非限定版本。
static void dfs();
告诉编译器dfs
是一个static
函数返回一个void
,可以采取的参数数目不详。 另外您提供哪些需要两个参数和调用相同功能的定义。 正如你看到的是没有合同的破裂。 问题是函数的声明是不正确。 如果要声明一个函数,它不带任何参数,你必须使用:
static void dfs(void);
一旦你这样做的编译器将为您提供一个诊断 。
还有您可以使用各种选项:
-
-Wstrict-prototypes
-
-Wmissing-prototypes
-
-Wold-style-definition
-
-Wold-style-declaration
即使你不使用这些工作-std=c99
或类似的东西。 我在办公室古色古香的代码所困扰,并使用这些(除-Wstrict-prototypes
,当我清理一些代码,没有得到“处理”)。 唯一的例外是因为函数指针的代码库中大多是没有必要的参数列表。 对于个人代码,或代码,我负责的是,这不是一个问题。
文章来源: How to let GCC warn unmatched number of arguments when making function calls?