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

时间:2013-03-31 04:59:43

标签: c gcc gcc-warning

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

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

那么,是否有一个GCC标志用于警告不匹配的函数调用参数号?我总是-Wall-pedantic开启;令人惊讶的是,这样一个明显的错误未被发现。 (实际上我认为海湾合作委员会没有报告的原因,但我现在想不出来。)

令人尴尬的代码示例:

    static void dfs();

    int main(int argc, const char *argv[]) {
         dfs(1);
    }

    static void
    dfs(int remain, int last) {
        // dfs
    }

我刚才发现的另一个发现是,如果原型包含参数,编译器将报告;但原型碰巧不包含任何参数,然后编译器就滑倒了。

2 个答案:

答案 0 :(得分:4)

无法匹配的函数调用参数是一种强制性诊断,所有编译器都必须提供这些参数而不需要任何特殊设置。它是由标准强制执行的。

C99标准6.5.2.2函数调用:
约束

  

如果表示被调用函数的表达式具有包含原型的类型,则   参数的数量应与参数的数量一致。每个论点都应该   具有一个类型,使其值可以分配给具有非限定版本的对象   其相应参数的类型。


 static void dfs();

告诉编译器dfs是一个static函数,它返回void并且可以获取未指定数量的参数。此外,您提供了一个函数的定义,它带有2个参数&打电话一样。如你所见,没有违约。问题是函数声明不正确。如果要声明一个不带参数的函数,则必须使用:

 static void dfs(void);

完成compiler will provide you a diagnostic

之后

答案 1 :(得分:0)

您可以使用各种选项:

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

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