1

刚刚调试了一个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
    }

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

4

2 回答 2

4

不匹配的函数调用参数数量是所有编译器都将并且必须在没有任何特殊设置的情况下提供的强制性诊断。这是标准规定的。

C99Standard 6.5.2.2 函数调用:
约束

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


 static void dfs();

告诉编译器dfs是一个static函数,它返回 avoid并且可以接受未指定数量的参数。此外,您为接受 2 个参数并调用相同的函数提供定义。如您所见,没有违约。问题是函数的声明不正确。如果你想声明一个不带参数的函数,你必须使用:

 static void dfs(void);

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

于 2013-03-31T05:01:21.367 回答
0

您可以使用多种选项:

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

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

于 2013-03-31T05:35:17.953 回答