C 枚举值定义中的逗号?
我有以下标志枚举定义(使用Cocoa宏):C 枚举值定义中的逗号?,c,enums,clang,C,Enums,Clang,我有以下标志枚举定义(使用Cocoa宏): typedef NS_选项(uint64_t,ItemDataType){ ... A=(1,是有效的代码,它将计算左操作数,然后丢弃该值并计算右操作数,这就是结果 来自C99标准草案第2段的逗号运算符部分6.5.17 逗号运算符的左操作数作为空表达式计算;存在 求值后的序列点。然后求值右操作数;结果具有 类型和值。97) 还值得注意的是,逗号运算符具有 如果您使用-Weverything标志,则使用提供以下警告: warning: expressio
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:你的示例语法完全错误,我的示例是有效的。你可以像我在左侧显示的那样轻松地操作一个值,并在右侧存储一个不同的值(和-墙显示警告)。