【问题标题】:Do you need to add an extra "," after the last member of a C enum? [duplicate]您是否需要在 C 枚举的最后一个成员之后添加额外的“,”? [复制]
【发布时间】:2018-08-04 16:00:44
【问题描述】:

我看到enum 的定义如下:

enum DAY{MON = 1, TUE, WED, THU, FRI, SAT, SUN,};

...编译成功。

在最后一个元素之后添加额外的“,”好吗?

【问题讨论】:

  • 显然是这样。对于将枚举成员写成多行(通常带有注释)然后删除最后一个成员的程序员来说,这是一个有用的功能。
  • 请注意,在 C90 中,尾随逗号是不允许的。 C99 及更高版本有一个明确的规则,允许尾随逗号:enum identifieropt { enumerator-list , }(语法中的前一个替代项没有那个逗号)。
  • @HansPassant 自动生成枚举常量更加方便。代码生成器在所有情况下都可以简单地发出一个尾随逗号,而不必考虑它是否是最后一个。

标签: c enums


【解决方案1】:
  • 不,您不需要最后一个逗号。
  • 是的,允许在末尾有一个额外的逗号。

此声明:

enum DAY{MON = 1, TUE, WED, THU, FRI, SAT, SUN,};

...等同于:

enum DAY{MON = 1, TUE, WED, THU, FRI, SAT, SUN};

要了解允许这种语法的优点,请查看@chqrlie's answer

【讨论】:

    【解决方案2】:

    enum 定义或数组初始值设定项中的尾随 , 是可选的,但非常有用,尤其是在跨越多行的列表中。由于对称性的原因,自 C99 起就允许这样做,因为它避免了列表中最后一项的不同语法:

    enum DAY {
        MON = 1,
        TUE,
        WED,
        THU,
        FRI,
        SAT,
        SUN,
    };
    

    它可以更轻松地使用脚本生成数组内容,并避免向数组添加额外元素但忘记添加逗号可能会被忽视的容易出错的情况:

    const char *osnames[] = {
        "CP/M",
        "MS/DOS",
        "Windows"
    }
    

    添加额外的项目:

    const char *osnames[] = {
        "CP/M",
        "MS/DOS",
        "Windows"
        "Linux",
        "OS/X"
    };
    

    注意列表中间缺少的逗号:编译器将第三个字符串解析为"WindowsLinux",并且该错误不会产生语法错误。

    每行都有尾随,,在不修改其他行的情况下添加和删除项目要容易得多。如果像下面的例子那样有条件地编译行会更有用:

    const char *osnames[] = {
        "CP/M",
        "MS/DOS",
        "Windows",
    #ifdef __UNIX__
        "Linux",
        "OS/X",
    #endif
    };
    

    【讨论】:

      猜你喜欢
      • 2015-05-17
      • 2010-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-20
      • 1970-01-01
      相关资源
      最近更新 更多