无参数行为的 C 函数
有人可以向我解释为什么下面的代码编译时没有警告或错误吗?
我希望编译器警告我函数 no_args
不需要任何参数。
但代码会递归地编译并运行函数 no_args
。
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();
}
Can somebody explain to me why the following code does compile without a warning or error?
I would expect the compiler to warn me that the function no_args
doesn't expect any arguments.
But the code compiles and runs function no_args
recursively.
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();
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
在 C++ 中,
void no_args()
声明一个不带参数(且不返回任何内容)的函数。在 C 中,
void no_args()
声明一个函数,该函数接受未指定(但不是可变)数量的参数(并且不返回任何内容)。因此,您的所有调用在 C 中都是有效的(根据原型)。在 C 中,使用 void no_args(void) 来声明一个真正不带参数(并且不返回任何内容)的函数。
In C++,
void no_args()
declares a function that takes no parameters (and returns nothing).In C,
void no_args()
declares a function that takes an unspecified (but not variable) number of parameters (and returns nothing). So all your calls are valid (according to the prototype) in C.In C, use
void no_args(void)
to declare a function that truly takes no parameters (and returns nothing).当您声明具有空参数列表的函数时,您将调用 K&R(原型前)语义,并且不会对参数列表进行任何假设;这样 ANSI C 之前的代码仍然可以编译。如果您想要一个带有空参数列表的原型函数,请使用
(void)
而不是()
。When you declare a function with an empty argument list, you invoke K&R (pre-prototype) semantics and nothing is assumed about the parameter list; this is so that pre-ANSI C code will still compile. If you want a prototyped function with an empty parameter list, use
(void)
instead of()
.