Jac*_*ack 5 c variable-declaration function-declaration
对于一个错字,我a留在那里.当我去编译时,编译器报告:
'a'和'f'的声明之间缺少','
码:
int a
f(void)
{
}
Run Code Online (Sandbox Code Playgroud)
因为我从来没有得到任何这样的错误信息,而且我不知道我可以在那里放一个逗号并且它编译得很好(在我测试的多个编译器中),这是非常令人惊讶的:
int a,
f(void)
{
}
Run Code Online (Sandbox Code Playgroud)
但当然这不是我的意图,而是int f(void){}代替.我尝试了另一个编译器,但它没有用,并报告了这样的语法错误(在clang中):
错误:预期';' 在顶级声明者之后.
我的问题是:哪一个是正确的?它应该或不应该编译?标准对这种行为有什么看法?
我不打算使用它,因为把变量和函数分成逗号有点难看(就像它是函数原型一样).我只是好奇.
编辑:添加void在函数参数中.其实我想用空参数写一个函数
不,它不应该编译
你需要
int a;
void f(void)
{
}
Run Code Online (Sandbox Code Playgroud)
此时此刻,空隙并不是最重要的部分。最重要的部分是你没有在 a 后面加分号。
当您在编译器之后不加分号时,int a编译器会继续读取下一行作为声明的一部分int,因此它没有检测到您有两件事您想要的,而是一件非常奇怪的事情,例如
int a f() { }
Run Code Online (Sandbox Code Playgroud)
通过添加逗号,您仍然没有解决问题;因为,逗号表示一个列表,这是声明整数列表的有效方法
int a, b;
Run Code Online (Sandbox Code Playgroud)
有效,同时
int a, f() { }
Run Code Online (Sandbox Code Playgroud)
不是因为f() { }不是整数的有效名称。类似的字符可能在其他地方有效,但前面的字符a,也阻止它在那里有效。本来应该是两行的组合阻止它成为有效的 C.
但是通过添加一个分号,现在您在 C 中得到了两个有意义的东西。
int a;
f() { }
Run Code Online (Sandbox Code Playgroud)
我强烈建议您编写的每个函数都有一个返回值,即使它什么也不返回。
int a;
void f() { }
Run Code Online (Sandbox Code Playgroud)
再次强调,明确指出该函数不带任何参数是一个非常好的做法,因此
int a;
void f(void) { }
Run Code Online (Sandbox Code Playgroud)
这相当于
int a;
void f(void)
{
}
Run Code Online (Sandbox Code Playgroud)