C 枚举值定义中的逗号?

C 枚举值定义中的逗号?,c,enums,clang,C,Enums,Clang,我有以下标志枚举定义(使用Cocoa宏): typedef NS_选项(uint64_t,ItemDataType){ ... A=(1,是有效的代码,它将计算左操作数,然后丢弃该值并计算右操作数,这就是结果 来自C99标准草案第2段的逗号运算符部分6.5.17 逗号运算符的左操作数作为空表达式计算;存在 求值后的序列点。然后求值右操作数;结果具有 类型和值。97) 还值得注意的是,逗号运算符具有 如果您使用-Weverything标志,则使用提供以下警告: warning: expressio

我有以下标志枚举定义(使用Cocoa宏):

typedef NS_选项(uint64_t,ItemDataType){
...
A=(1
是有效的代码,它将计算左操作数,然后丢弃该值并计算右操作数,这就是结果

来自C99标准草案第2段的逗号运算符部分
6.5.17

逗号运算符的左操作数作为空表达式计算;存在 求值后的序列点。然后求值右操作数;结果具有 类型和值。97)

还值得注意的是,逗号运算符具有

如果您使用
-Weverything
标志,则使用提供以下警告:

warning: expression is not an integer constant expression; folding it to a constant is a GNU extension [-Wgnu-folding-constant]
TEST = (A | B | C , G)
       ^~~~~~~~~~~~~~~
warning: left-hand operand of comma expression has no effect [-Wunused-value]
 TEST = (A | B | C , G)
                   ^
error: enumerator value for 'TEST' is not an integer constant
这是正确的值必须是常量表达式,因为常量表达式不能包含逗号运算符

gcc
在这种情况下,如果我使用
-Wall
标志,则会给出错误和警告:

warning: expression is not an integer constant expression; folding it to a constant is a GNU extension [-Wgnu-folding-constant]
TEST = (A | B | C , G)
       ^~~~~~~~~~~~~~~
warning: left-hand operand of comma expression has no effect [-Wunused-value]
 TEST = (A | B | C , G)
                   ^
error: enumerator value for 'TEST' is not an integer constant
是有效代码,它将计算左操作数,然后丢弃该值并计算右操作数,这将是结果

来自C99标准草案第2段的逗号运算符部分
6.5.17

逗号运算符的左操作数作为空表达式计算;存在 求值后的序列点。然后求值右操作数;结果具有 类型和值。97)

还值得注意的是,逗号运算符具有

如果您使用
-Weverything
标志,则使用提供以下警告:

warning: expression is not an integer constant expression; folding it to a constant is a GNU extension [-Wgnu-folding-constant]
TEST = (A | B | C , G)
       ^~~~~~~~~~~~~~~
warning: left-hand operand of comma expression has no effect [-Wunused-value]
 TEST = (A | B | C , G)
                   ^
error: enumerator value for 'TEST' is not an integer constant
这是正确的值必须是常量表达式,因为常量表达式不能包含逗号运算符

gcc
在这种情况下,如果我使用
-Wall
标志,则会给出错误和警告:

warning: expression is not an integer constant expression; folding it to a constant is a GNU extension [-Wgnu-folding-constant]
TEST = (A | B | C , G)
       ^~~~~~~~~~~~~~~
warning: left-hand operand of comma expression has no effect [-Wunused-value]
 TEST = (A | B | C , G)
                   ^
error: enumerator value for 'TEST' is not an integer constant

关键是括号。如果没有括号,那么它将存储
A | B | C
的值,但就目前而言,它存储
G
的值。逗号运算符的优先级比任何C运算符都低,并且充当序列点。您能否提供一个实际的示例,说明该运算符将在何处使用像这样的上下文?编译器至少应该抛出一个警告。@LeoNatan:为什么它应该抛出一个警告?会(a+=2,b+=3);抛出一个警告?如果这是期望的效果怎么办?@GIJoe为什么
if(a=3){
抛出警告?有些东西是模糊的,不应该被允许。枚举值定义中逗号运算符的值是多少?@LeoNatan:你的示例语法完全错误,我的示例是有效的。你可以像我在左侧显示的那样轻松地操作一个值,并在右侧存储一个不同的值(和-墙显示警告)。关键是括号。如果没有括号,那么它将存储
A | B | C
的值,但现在,它存储
G
的值。逗号运算符的优先级比任何C运算符都低,并充当序列点。您能否提供一个实际示例,说明该运算符将在何处使用像这样的上下文?编译器至少应该抛出一个警告。@LeoNatan:为什么它应该抛出一个警告?会(a+=2,b+=3);抛出一个警告?如果这是期望的效果怎么办?@GIJoe为什么
if(a=3){
抛出警告?有些东西是模糊的,不应该被允许。枚举值定义中逗号运算符的值是多少?@LeoNatan:你的示例语法完全错误,我的示例是有效的。你可以像我在左侧显示的那样轻松地操作一个值,并在右侧存储一个不同的值(和-墙显示警告)。