【问题标题】:C11 - enums in Generic SelectionsC11 - 通用选择中的枚举
【发布时间】:2015-03-20 00:32:15
【问题描述】:
printf("%i", _Generic(REGISTER_AX, enum SegmentRegister: 0, enum GpRegister: 1, default: 2));

在上面的代码中,想要的结果是1,因为REGISTER_AXenum GpRegister的成员。 即使编译器很乐意接受enums 作为关联类型,代码也会打印出2,因为枚举值被评估为int

我的问题是:有没有办法产生所需的结果,通用选择中的表达式是否会与 enum 类型相关联?

【问题讨论】:

  • 在 C(标准的任何版本)中,枚举常量的类型为 int。

标签: c generics enums selection c11


【解决方案1】:

枚举类型对于_Generic 来说不是很好的测试,这有两个不同的原因。

首先,正如评论中已经提到的,这种类型的常量本身是int类型,而不是枚举类型。

其次,您将使用该类型声明的值(例如作为变量或强制转换)将与一种特定的整数类型兼容。哪种类型取决于实现(=编译器),甚至可能因枚举类型而异。

所以基本上很难区分枚举类型和其他整数类型。如果你再深入一点,事情会变得更加困难,兼容类型不是传递关系。

【讨论】:

  • 来自 C++ 背景,我还没有完全精通 C 的精妙之处。我很想知道枚举常量为 int 类型的原因,而不是enum 隐式转换为 int 的类型。另外,我确实相信enums 与其他enums 和int 完全不兼容(尽管可以隐式转换)。由于控制表达式实际上并未被计算,因此无需进行隐式转换,并且在泛型选择中使用多个隐式可转换(但不同)的类型根本不成问题。
  • 我认为所有这些都没有任何理由。这些是历史文物,enum 是在 C 中引入的,当时所有整数基本上仍然在int。 C 是一种保守的语言,需要一个很好的理由来使有效的现有代码在新版本的标准中无效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-03
  • 2014-08-06
  • 1970-01-01
相关资源
最近更新 更多