c - 如何让 GCC 在进行函数调用时警告参数数量不匹配?

标签 c gcc gcc-warning

我刚刚调试了很久的C程序,才发现我在函数调用的时候漏掉了一个参数,所以junk反而补上了漏掉的参数。像这样的愚蠢错误确实令人沮丧,但我想编译器应该能够检测到这一点。 (C 甚至不支持默认参数;即使在 C++ 中,也需要显式声明默认参数。)

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

那么,是否有 GCcflags用于警告不匹配的函数调用参数号?我总是打开 -Wall-pedantic;这么明显的错误竟然没有被发现,真是令人惊讶。 (实际上我想 GCC 没有报告是有原因的,但我现在想不出任何原因。)

尴尬的代码示例:

    static void dfs();

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

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

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

最佳答案

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

C99Standard 6.5.2.2 函数调用:
约束

If the expression that denotes the called function has a type that includes a prototype, the number of arguments shall agree with the number of parameters. Each argument shall have a type such that its value may be assigned to an object with the unqualified version of the type of its corresponding parameter.


 static void dfs();

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

 static void dfs(void);

一旦你这样做了 compiler will provide you a diagnostic .

关于c - 如何让 GCC 在进行函数调用时警告参数数量不匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15726506/

相关文章:

c - 将负数打印为 C 中明确定义的字符吗?

c - C 中的 Trie : Pointer detected as null. 导致内存泄漏

c++ - GCC 将共享库链接到可执行文件

c - 基本C程式设计错误

c - GNU 中 _TRACE 宏在哪里定义?

c - 将 char** 传递给 void** 函数参数时,与指针类型不兼容的指针类型警告

c - 为什么 YACC 不产生 shift-reduce 冲突?

c++ - "Linux Kernel API"、 "System Calls"、 "System Interfaces"和 "GNU C Library"有什么区别?

c++ - Mac 上体系结构 x86_64 c++ 的 undefined symbol

ios - 如何抑制每个文件的 -Wno-protocol