如何让GCC在进行函数调用时警告无数的参数?

我只是调试了一个C程序很长一段时间,却发现我在进行函数调用时错过了一个参数,所以垃圾填充了缺少的参数。 像这样的愚蠢错误确实令人沮丧,但我想编译器应该能够检测到这一点。 (C甚至不支持默认参数;即使在C ++中,也需要显式声明默认参数。)

更新:原型被发现也是错的……

那么,是否有一个GCC标志用于警告不匹配的函数调用参数号? 我一直都有 – -pedantic-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并且可以获取未指定数量的参数。 此外,您提供了函数的定义,它接受2个参数并调用相同的参数。 如你所见,没有违约。 问题是函数声明不正确。 如果要声明一个不带参数的函数,则必须使用:

  static void dfs(void); 

一旦这样做, 编译器将为您提供诊断

您可以使用各种选项:

  • -Wstrict-prototypes
  • -Wmissing-prototypes
  • -Wold-style-definition
  • -Wold-style-declaration

即使你没有使用-std=c99或类似的东西,这些工作也可以。 我在办公室里受到古董代码的困扰,当我清理一些没有给予“处理”的代码时,使用这些代码(除了-Wstrict-prototypes )。 例外是因为代码库中函数的指针大多没有必要的参数列表。 对于个人代码或我负责的代码,这不是问题。