应该int a,f(){}编译?

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在函数参数中.其实我想用空参数写一个函数

Edw*_*uck 3

不,它不应该编译

你需要

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)