首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何让GCC在进行函数调用时警告数量不匹配的参数?

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

Stack Overflow用户
提问于 2013-03-31 12:59:43
回答 2查看 1.4K关注 0票数 1

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

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

那么,有没有一个警告函数调用参数号不匹配的GCC标志呢?我总是打开-Wall-pedantic;如此明显的错误没有被检测到,这是相当令人惊讶的。(其实我想GCC不报道是有原因的,但我现在想不出有什么原因)

令人尴尬的代码示例:

代码语言:javascript
运行
复制
    static void dfs();

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

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

我刚刚做的另一个发现是,如果原型包含参数,编译器将报告;但原型恰好不包含参数,那么编译器就会滑倒。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-31 13:01:21

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

C99Standard 6.5.2.2函数调用:

Constraints

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

代码语言:javascript
运行
复制
 static void dfs();

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

代码语言:javascript
运行
复制
 static void dfs(void);

一旦你这样做了,。

票数 4
EN

Stack Overflow用户

发布于 2013-03-31 13:35:18

您可以使用以下各种选项:

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

即使你不使用-std=c99或类似的东西,这些方法也能正常工作。我在办公室被古老的代码所困扰,当我清理一些没有得到“治疗”的代码时,我会使用这些(除了-Wstrict-prototypes)。例外是因为代码库中指向函数的指针大多没有必要的参数列表。对于个人代码,或者我负责的代码,这不是问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15726506

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档