C enum声明中是否需要最后一个逗号?
即是VAL3必要后的逗号?
enum { Val1, Val2, Val3, } someEnum;
Run Code Online (Sandbox Code Playgroud)
将其留入/取出是否有任何副作用
谢谢
pax*_*blo 37
这不是必需的.6.7.2.2C99 部分将语法列为:
enum-specifier:
enum identifieropt { enumerator-list }
enum identifieropt { enumerator-list , }
enum identifier
enumerator-list:
enumerator
enumerator-list , enumerator
enumerator:
enumeration-constant
enumeration-constant = constant-expression
Run Code Online (Sandbox Code Playgroud)
注意前两种形式enum-specifier,一种带有逗号,另一种带有逗号.
我见过使用它的一个好处是:
enum {
Val1,
Val2,
Val3,
} someEnum;
Run Code Online (Sandbox Code Playgroud)
在那里,如果你想添加的(例如)Val4和Val5,你只要复制并粘贴Val3线,而不必担心调整逗号.
并且,正如评论中所指出的,它也可以简化自动代码生成器,以便它们不必对最终值进行特殊处理.他们可以输出每个值后跟逗号.
这可以比作常见的SQL:
select fld1, fld2 from tbl where 1=1 and fld1 > 8
Run Code Online (Sandbox Code Playgroud)
在这种情况下,where 1=1只有这样你就不必where在你的第一个条款and之前和之后的每个条款之前.您可以依赖于where已经存在的事实,并且仅and用于您添加的所有内容.
有些人可能会觉得这种懒惰和他们是对的,但这不一定是坏事:-)
任何体面的DBMS查询优化器都应该能够在转到数据库表之前去掉像这样的常量子句.
Joh*_*itb 15
像其他人一样,逗号不是必需的.但它在C99中是新的(在C89中是不允许的)并且将在下一版本的C++中被允许.
另一个基本原理是在"长度"枚举器和普通枚举器之间做出改变:
enum Items {
A,
B,
C,
LENGTH
};
Run Code Online (Sandbox Code Playgroud)
现在,您可以在编码指南中加入枚举中的最后一项应该使用逗号,但如果它是"长度"项目则不会 - 这只是说明了有多少项目.
它还有助于自动生成项目(使用宏/预处理器),就像其他答案一样.
在标准C89中,不允许使用最后一个逗号.完全停止.
允许它是一个共同的延伸; 特别是,它得到了海湾合作委员会的支持,但该标准明确禁止它.
在标准C99中,允许使用最后一个逗号,以便与数组和结构初始值设定项保持对称,它始终允许在最后一项上使用尾随逗号.
6.7.2.2枚举说明符
句法
Run Code Online (Sandbox Code Playgroud)enum-specifier: enum identifieropt { enumerator-list } enum identifieropt { enumerator-list , } enum identifier
允许尾随逗号的主要优点是它允许更容易的机器生成(C源代码) - 您不必为初始化器列表中的最后一个(或可能是第一个)项编写特殊案例代码.因此,像Yacc和Lex这样的程序,仅举两个,可以稍微简单一些.
,定义或数组初始值设定项中的尾随enum是可选的,但非常有用,尤其是在跨越多行的列表中。由于对称性的原因,从 C99 开始就允许这样做,因为它为所有行的每个项目提供了相同的结构:
enum DAY {
MON = 1,
TUE,
WED,
THU,
FRI,
SAT,
SUN,
};
Run Code Online (Sandbox Code Playgroud)
它可以更轻松地使用脚本生成数组内容,并避免容易出错的情况,即向数组添加额外元素但忘记添加逗号可能会被忽视:
const char *osnames[] = {
"CP/M",
"MS/DOS",
"Windows"
}
Run Code Online (Sandbox Code Playgroud)
添加额外项目:
const char *osnames[] = {
"CP/M",
"MS/DOS",
"Windows"
"Linux",
"OS/X"
};
Run Code Online (Sandbox Code Playgroud)
请注意列表中间缺少的逗号:编译器将第三个字符串解析为,"WindowsLinux"并且该错误不会生成语法错误。
通过每行的尾随,,可以更轻松地添加和删除项目,而无需修改其他行。如果像本示例中那样有条件地编译行,则更加有用:
const char *osnames[] = {
"CP/M",
"MS/DOS",
"Windows",
#ifdef __UNIX__
"Linux",
"OS/X",
#endif
};
Run Code Online (Sandbox Code Playgroud)