【问题标题】:enumerations in C from a c++ perspective从 C++ 角度看 C 中的枚举
【发布时间】:2011-10-18 18:46:35
【问题描述】:

我是一名 C++ 程序员,我很少需要处理 GCC “C”。我目前正在将一些代码从 C++ 转换为 C 以用于 GCC 编译器。

在 C++ 中,我将使用以下源代码。请注意,我将使用一个类作为范围。

C++源码

class Card {
public:
   enum Suit {
      Diamonds, Hearts, Clubs, Spades
   };
};

class Weapon {
public:
   enum WeaponType {
      Rocks, Clubs, Guns
   };
};

int main () {
 Suit a = Card::Clubs; 
 WeaponType b = Weapon::Clubs
}

在“C”中没有类,也没有办法区分两个不同的“clubs”关键字。尝试编译时收到以下错误消息

错误 C2365:“俱乐部”:重新定义;以前的定义是 '枚举器'

C 源代码

enum Suit {
    Diamonds, Hearts, Clubs, Spades
};

enum WeaponType {
    Rocks, Clubs, Guns
};

int main () {
 Suit a = Clubs; 
 WeaponType b = Clubs
}

所以我的问题是

  • 如何在同一个文件中用相同的关键字声明两个不同的枚举?
  • 如何为枚举添加范围,以便我可以使用相同的枚举名称为不同的枚举分配不同的变量?

【问题讨论】:

    标签: c++ c enums


    【解决方案1】:

    像过去一样做:

    enum Suit {
        ST_Diamonds, ST_Hearts, ST_Clubs, ST_Spades
    };
    
    enum WeaponType {
        WT_Rocks, WT_Clubs, WT_Guns
    };
    
    int main () {
     Suit a = ST_Clubs; 
     WeaponType b = WT_Clubs;
     return 0;
    }
    

    【讨论】:

    • 我一直更喜欢最后的类型:Club_Suit、Club_Weapon,因为它更接近英语语法。我带着我的 Club_Weapon 前往 Club_Building。不过最终还是有同样的区别。
    • @Mooing Duck 归根结底,这只是一个命名约定偏好。只要它有意义且一致,就应该没问题 :) 我个人更喜欢将类型作为前缀,因为在英语中我们从左到右阅读,所以我马上就知道它属于什么类型。跨度>
    【解决方案2】:

    这不能在标准 C 中完成。来自 C A 参考手册:“声明为枚举常量的标识符与变量函数和 typedef 名称在同一个重载类中”,因此枚举常量在给定范围。

    【讨论】:

      【解决方案3】:

      由于 C 中缺少命名空间,您唯一的选择是添加前缀:

      enum Weapon {
          WeaponRocks,
          WeaponSocks,
          ...
      };
      

      【讨论】:

        猜你喜欢
        • 2010-11-26
        • 2014-08-26
        • 1970-01-01
        • 2016-07-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多