有人可以向我解释为什么以下代码在没有警告或错误的情况下编译?
我希望编译器警告我函数测试不要求任何参数.
但代码递归编译并运行函数测试.
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)
声明一个真正不带参数的函数(并且不返回任何参数).
gee*_*aur 12
当您使用空参数列表声明一个函数时,您将调用K&R(预原型)语义,并且不会假设参数列表; 这样前ANSI C代码仍然可以编译.如果您想要一个带有空参数列表的原型函数,请使用(void)
而不是()
.