无参数行为的C函数

无参数行为的C函数,c,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(

有人能解释一下为什么下面的代码在编译时没有警告或错误吗

我希望编译器警告我函数
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();
}

当您声明一个参数列表为空的函数时,您调用K&R(pre-prototype)语义,并且对参数列表不作任何假设;这样,ANSI C之前的代码仍然可以编译。如果您想使用一个空参数列表的原型函数,则使用<代码>(空隙)< /COD>而不是<代码>()<>代码> ./p> C++,<代码>空隙NOIAGARSH()/Calp>声明一个不带参数(并且没有返回任何参数)的函数。 在C语言中,
void no_args()
声明一个函数,该函数接受未指定数量(但不是变量)的参数(并且不返回任何内容)。因此,您的所有调用(根据原型)在C中都是有效的


在C语言中,使用
void no_args(void)
来声明一个真正不带参数(且不返回任何参数)的函数。

未指定(但不是变量)是什么意思,我可以在函数中引用这些参数吗?@John-如果函数是用参数定义的,则是。您必须执行
void test();intmain(void){test();}void test(inta,intb,intc){puts(“Yo”);test(a,b,c);}
(或将
test
放在单独的文件中。)+1表示“未指定(但不是变量)”@这意味着编译器不会检查参数的数量(或类型),但您必须使用与定义中的参数匹配的参数调用函数。请注意,定义和声明不必在同一个文件中。在OP提供的示例中,
test
是在没有参数的情况下定义的,尽管原型并不强制它,但使用一个或多个参数调用
test()
会调用未定义的行为哇,我是一名C/C++程序员十多年了,从来都不知道这一点!谢谢。请注意,gcc有选项
-Wstrict prototype
来警告这一点。该选项不是
-Wall
甚至
-Wextra
的一部分。我已经在发布了一个测试运行;还有我默认的gcc别名:)@chrisyes。为什么,为什么人们在这里发帖时会让他们的示例代码变得如此难以阅读。使用完全不同的名称而不是几乎相同的名称有什么不对???请大家不要使用像“test”和“test1”这样的名称,使用像“A”、“B”和“C”这样的名称。除了正确的答案表明空参数集不是C中的原型之外,您可以在GCC中使用
-Wstrict prototype
和在MSVC中使用
/Wall/W4
启用缺少原型的警告。请注意,
-Wall
没有在GCC中启用该警告(我不知道为什么)。哎呀,我在打算拒绝该问题时批准了对该问题的编辑。@Tomalak Geret'kal:作者所做的原始编辑意味着下面的答案与上面的源代码不匹配。。。也许你真的想接受它,只是你还没有意识到而已当然
void main()
应该是
int main(void)