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

C int a,f(){}应该编译吗?,c,variable-declaration,function-declaration,C,Variable Declaration,Function Declaration,对于打字错误,我将a留在那里。当我开始编译时,编译器报告: 在声明“a”和“f”之间缺少“,” 代码: 非常令人惊讶,因为我从来没有收到过这样的错误消息,我不知道我可以在那里放一个逗号,它编译得很好(在我测试的多个编译器中): 但是当然这不是我的意图,而是intf(void){}而不是。我在另一个编译器中进行了一次尝试,但没有成功,并报告了如下语法错误(以铿锵的形式): 错误:应为“;”在顶级声明器之后 我的问题是:哪一个是正确的?它应该编译还是不应该编译?标准对这种行为怎么说 我不打算使用它,

对于打字错误,我将
a
留在那里。当我开始编译时,编译器报告:

在声明“a”和“f”之间缺少“,”

代码:

非常令人惊讶,因为我从来没有收到过这样的错误消息,我不知道我可以在那里放一个逗号,它编译得很好(在我测试的多个编译器中):

但是当然这不是我的意图,而是
intf(void){}
而不是。我在另一个编译器中进行了一次尝试,但没有成功,并报告了如下语法错误(以铿锵的形式):

错误:应为“;”在顶级声明器之后

我的问题是:哪一个是正确的?它应该编译还是不应该编译?标准对这种行为怎么说

我不打算使用它,因为用逗号分隔变量和函数有点难看(就像函数原型一样)。我只是好奇


编辑:在函数参数中添加了
void
。实际上,我想编写一个带有空参数的函数

不,它不应该编译

你需要

int a;
void f(void)
{
}
此时此刻,空洞并不是最重要的部分。最重要的是你没有在a后面加分号

当你在
int a
后面不加分号时,编译器会在
int
声明的下一行继续读取,因此它没有检测到你有两件想要的东西,而是一件非常奇怪的事情,比如

int a f() { }
通过添加逗号,您仍然没有解决问题;因为,逗号表示一个列表,这是声明整数列表的有效方法

int a, b;
有效期为

int a, f() { }
不是因为
f(){}
不是整数的有效名称。这样的字符在其他地方可能有效,但前面的
a、
也会阻止它在其他地方有效。本来应该是两行的组合会阻止它成为有效的C

但通过添加分号,现在在C中可以得到两个合理的结果

int a;
f() { }
我强烈建议您编写的每个函数都有一个返回值,即使它什么也不返回

int a;
void f() { }
同样,明确指出函数不接受任何参数是一种非常好的做法,因此

int a;
void f(void) { }
这相当于

int a;
void f(void)
{
}

这将是一个语法错误。函数定义的语法是

//        int             f()                                {}
declaration-specifiers declarator declaration-list[opt] compound-statement

f()
之前没有空间容纳
a,
(我是基于随机的C11草稿)。对于C89,它看起来很相似,只是
声明说明符
是可选的(因为隐式int规则)

语言语法不允许函数定义作为声明的一部分出现1。你能做的就是写作

int a, f(void);
因为这只是
f
的声明



1.也就是说,从声明非终端到函数定义非终端没有路径;参见

的附录A这是
C89
函数定义吗?C99不允许在文件范围内进行空声明(在最后两个示例中,
f
函数体的
}
结束后)。您谈论的是声明,而不是语句(文件范围中没有语句)。@FiddlingBits:
void f(){}
在C89/C90、C99和C11中是有效的函数定义。在该语言的所有三个版本中,
void f(void){}
是首选。(C89中引入了
void
关键字和原型语法。)我将添加参数void,最好不要让旧的实践伤害新的程序员。前者似乎是有效的C89,后者是无效的。对于C99,我非常确定,两者都是无效的(并且gcc拒绝使用
-std=C99-pedantic
进行编译)<代码>int a,f()(后者是一个函数声明(函数使用未指定数量的参数返回
int
),没有定义),但是,它是有效的C99。你对哪个标准感兴趣?很高兴知道,我将删除我的评论,因为它实际上并不意味着比你说的更多,但在重读时,你说得比我更清楚。
//        int             f()                                {}
declaration-specifiers declarator declaration-list[opt] compound-statement
int a, f(void);