所有现代编译器(clang 3.6,gcc 4.8)允许在参数中使用_
编写函数'名单。
像这样:
int func(_)
{
return 1;
}
即使main
也允许这样的参数(int main(_)
)
唯一的警告是
p1_concat.c:31:5:警告:'_'的类型默认为'int'[默认启用]
这个下划线是什么意思?
答案 0 :(得分:4)
下划线_
是有效的普通标识符。定义这样的函数:
type function(arg1, arg2, arg3)
{
...
}
(即没有参数类型)是一种不推荐使用的样式,从ANSI之前的日子开始称为 K& R风格的定义。所有参数都隐含地具有类型int
,除非你显式地声明它们具有不同的类型:
type function(arg1, arg2, arg3)
type arg1;
type arg2;
type arg3;
{
...
}
其中type arg1;
是普通声明。这些定义仍然允许但已弃用。因为您没有显式声明_
,编译器会警告您隐式声明为int
。
答案 1 :(得分:0)
此
int func(_)
{
return 1;
}
是一个函数定义,其标识符列表由一个名称为_
(下划线)的标识符组成。
这不是正确的功能定义。根据C标准(6.9.1函数定义)
6如果声明者包含一个标识符列表,则每个声明都在 声明清单应至少有一个声明者 声明者只应声明标识符列表中的标识符, ,标识符列表中的每个标识符都应声明为。
定义函数更为正确,例如
int func(_)
int _;
{
return 1;
}
至于主要的
的类似定义int main(_)
{
//...
}
那么它就不是一个有效的main声明,即使添加标识符_
的定义就像上面所做的那样
int main(_)
int _;
{
//...
}
C标准不允许使用标识符列表声明main。至少它不是主要的标准声明。