多个枚举成员同名

时间:2016-01-02 12:36:32

标签: c enums

我正在浏览一些netfilter代码。

我不知道任何指定具有重复名称的枚举成员的C规则。

enum    ctattr_type { 
  CTA_UNSPEC, 
  CTA_TUPLE_ORIG, 
  CTA_TUPLE_REPLY, 
  CTA_STATUS, 
  CTA_PROTOINFO, 
  CTA_HELP, 
  CTA_NAT_SRC, 
  CTA_TIMEOUT, 
  CTA_MARK, 
  CTA_COUNTERS_ORIG, 
  CTA_COUNTERS_REPLY, 
  CTA_USE, 
  CTA_ID, 
  CTA_NAT_DST, 
  CTA_TUPLE_MASTER, 
  CTA_NAT_SEQ_ADJ_ORIG, 
  CTA_NAT_SEQ_ADJ_REPLY, 
  CTA_SECMARK, 
  CTA_ZONE, 
  CTA_SECCTX, 
  CTA_TIMESTAMP, 
  CTA_MARK_MASK, 
  CTA_LABELS, 
  CTA_LABELS_MASK, 
  __CTA_MAX, 
  CTA_UNSPEC, 
  CTA_TUPLE_ORIG, 
  CTA_TUPLE_REPLY, 
  CTA_STATUS, 
  CTA_PROTOINFO, 
  CTA_HELP, 
  CTA_NAT_SRC, 
  CTA_TIMEOUT, 
  CTA_MARK, 
  CTA_COUNTERS_ORIG, 
  CTA_COUNTERS_REPLY, 
  CTA_USE, 
  CTA_ID, 
  CTA_NAT_DST, 
  CTA_TUPLE_MASTER, 
  CTA_NAT_SEQ_ADJ_ORIG, 
  CTA_NAT_SEQ_ADJ_REPLY, 
  CTA_SECMARK, 
  CTA_ZONE, 
  CTA_SECCTX, 
  CTA_TIMESTAMP, 
  CTA_MARK_MASK, 
  CTA_LABELS, 
  CTA_LABELS_MASK, 
  __CTA_MAX, 
  CTA_UNSPEC, 
  CTA_TUPLE_ORIG, 
  CTA_TUPLE_REPLY, 
  CTA_STATUS, 
  CTA_PROTOINFO, 
  CTA_HELP, 
  CTA_NAT_SRC, 
  CTA_TIMEOUT, 
  CTA_MARK, 
  CTA_COUNTERS_ORIG, 
  CTA_COUNTERS_REPLY, 
  CTA_USE, 
  CTA_ID, 
  CTA_NAT_DST, 
  __CTA_MAX 
}

此处__CTA_MAX多次出现。事实上,许多其他属性枚举被重复定义。

当我打印__CTA_MAX值时,它会打印出第一个出现的枚举值。 23

那么其他__CTA_MAX值的用途是什么。重复使用其他属性有什么用。

1 个答案:

答案 0 :(得分:4)

根据C11标准(取自http://port70.net/~nsz/c/c11/n1570.html#6.7.2.2):

  

6.7.2.2枚举说明符
  ...
  的脚注:
  127)因此,在同一范围内声明的枚举常量的标识符应彼此不同,并且与普通声明符中声明的其他标识符不同。

因此在一个中重复使用相同的枚举常量 枚举(甚至在两个中使用相同的枚举常量) 在同一范围内的不同枚举)在C中无效。

您看到的很可能是Doxygen创建的人工制品,并未反映源代码中的实际定义。

来自linux_nfnetlink_conntrack.hhttp://git.netfilter.org中的定义只是

enum ctattr_type {
    CTA_UNSPEC,
    CTA_TUPLE_ORIG,
    CTA_TUPLE_REPLY,
    CTA_STATUS,
    CTA_PROTOINFO,
    CTA_HELP,
    CTA_NAT_SRC,
#define CTA_NAT CTA_NAT_SRC /* backwards compatibility */
    CTA_TIMEOUT,
    CTA_MARK,
    CTA_COUNTERS_ORIG,
    CTA_COUNTERS_REPLY,
    CTA_USE,
    CTA_ID,
    CTA_NAT_DST,
    CTA_TUPLE_MASTER,
    CTA_SEQ_ADJ_ORIG,
    CTA_NAT_SEQ_ADJ_ORIG    = CTA_SEQ_ADJ_ORIG,
    CTA_SEQ_ADJ_REPLY,
    CTA_NAT_SEQ_ADJ_REPLY   = CTA_SEQ_ADJ_REPLY,
    CTA_SECMARK,        /* obsolete */
    CTA_ZONE,
    CTA_SECCTX,
    CTA_TIMESTAMP,
    CTA_MARK_MASK,
    CTA_LABELS,
    CTA_LABELS_MASK,
    __CTA_MAX
};
#define CTA_MAX (__CTA_MAX - 1)