有人可以向我解释为什么以下代码在没有警告或错误的情况下编译?
我希望编译器警告我函数测试不要求任何参数。
但代码会递归编译并运行函数测试。
static void test1(int a, int b, int c) { }
static void test() {
printf("HERE\n");
test(1, 2, 3);
}
void main() {
test();
}
答案 0 :(得分:51)
在C ++中,void test()
声明一个不带参数的函数(并且不返回任何内容)。
在C中,void test()
声明一个函数,它接受一个未指定(但不是可变)的参数(并且不返回任何参数)。所以你的所有电话都是有效的(根据原型)在C。
在C中,使用void test(void)
声明一个真正不带参数的函数(并且不返回任何参数)。
答案 1 :(得分:11)
当您使用空参数列表声明一个函数时,您将调用K& R(预原型)语义,并且不会假设参数列表;这样前ANSI C代码仍然可以编译。如果您想要一个带有空参数列表的原型函数,请使用(void)
而不是()
。