如何让GCC警告无与伦比的一些参数进行函数调用时?(How to let GCC warn unma

2019-10-17 22:46发布

我只是调试一个C程序很长一段时间,才发现我做一个函数调用时没有参数,所以垃圾,而不是填补缺少的参数。 这样愚蠢的错误是很无奈,但我想编制者应能够检测到这一点。 (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
    }

我只是做了另一个发现是,如果原型包含参数,编译器将报告; 但原型发生在不包含参数,那么编译器只是滑倒。

Answer 1:

函数调用的参数不匹配的号码是强制性的诊断,所有的编译器都必须提供没有任何特殊的设置。 它是由标准的规定。

C99Standard 6.5.2.2函数调用:
约束

如果它表示所调用的函数的表达有一个类型,其包括一个原型,参数的数目应的参数的数量一致。 每个参数应具有这样的类型,它的值可以被分配给对象与其相应的参数的类型的非限定版本。


 static void dfs();

告诉编译器dfs是一个static函数返回一个void ,可以采取的参数数目不详。 另外您提供哪些需要两个参数和调用相同功能的定义。 正如你看到的是没有合同的破裂。 问题是函数的声明是不正确。 如果要声明一个函数,它不带任何参数,你必须使用:

 static void dfs(void);

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



Answer 2:

还有您可以使用各种选项:

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

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



文章来源: How to let GCC warn unmatched number of arguments when making function calls?