C函数没有参数行为

Joh*_*ack 31 c

有人可以向我解释为什么以下代码在没有警告或错误的情况下编译?

我希望编译器警告我函数测试不要求任何参数.

但代码递归编译并运行函数测试.

static void has_args(int a, int b, int c) { 
    printf("has_args\n");
}

static void no_args() {
    printf("no_args\n");
    no_args(1, 2, 3);
}

void main() {
  no_args();
}
Run Code Online (Sandbox Code Playgroud)

Chr*_*utz 55

在C++中,void no_args()声明一个不带参数的函数(并且不返回任何参数).

在C中,void no_args()声明一个带有未指定(但不是可变)数量的参数的函数(并且不返回任何内容).所以你的所有调用都是有效的(根据原型)在C.

在C中,用于void no_args(void)声明一个真正不带参数的函数(并且不返回任何参数).

  • 哇,我是一名C/C++程序员已经十多年了,从来不知道这一点!谢谢. (10认同)
  • +1表示"未指定(但不可变)"; @John这意味着编译器不会检查参数的数量(或类型),但您必须使用与定义中的参数匹配的参数调用该函数.请注意,定义和声明不必在同一个文件中.在OP提供的示例中,`test`是在没有参数的情况下定义的,虽然原型没有强制它,但是用一个或多个参数调用`test()`会调用Undefined Behavior (3认同)
  • “在 C 中,void no_args() 声明一个接受未指定的函数”仅当它是声明而不是定义时才为真。C11 6.7.5.3:14。“作为该函数定义一部分的函数声明符中的空列表指定该函数没有参数。” (3认同)
  • 请注意,gcc 有选项`-Wstrict-prototypes` 来警告这一点。该选项不是`-Wall` 甚至`-Wextra` 的一部分。*我已经在 http://pastehtml.com/view/1ef7p3a.html 发布了一个测试运行;也是我默认的 gcc 别名 :)* (2认同)

gee*_*aur 12

当您使用空参数列表声明一个函数时,您将调用K&R(预原型)语义,并且不会假设参数列表; 这样前ANSI C代码仍然可以编译.如果您想要一个带有空参数列表的原型函数,请使用(void)而不是().