【问题标题】:string representation of enum values [duplicate]枚举值的字符串表示
【发布时间】:2010-03-30 06:56:19
【问题描述】:

gcc 4.4.2 c89

我有以下枚举:

enum drop_options_e
{
    drop_ssm,
    drop_snm,
    drop_ssb
};

我只是想知道这是从枚举中获取字符串表示值的最佳方法。

所以基本上,我可以得到“drop_ssm”,而不是为 drop_ssm 返回值 0。

非常感谢您的建议,

【问题讨论】:

    标签: c


    【解决方案1】:

    一种方法是这样做:

    enum drop_options_e
    {
        drop_ssm = 0,
        drop_snm ,
        drop_ssb  ,
        LAST_ENTRY   /* Should be last entry */
    };
    
    const char* drop_options_s[LAST_ENTRY] = {"drop_ssm", "drop_snm", "drop_ssb"};
    

    当你想要一个枚举的字符串表示时,你可以drop_options_s[enum];

    【讨论】:

    • 如果这个枚举在多个文件中使用,为了完成这项工作,我需要将 drop_options_s 设为静态,并且每次枚举文件都包含在另一个文件中,如果 drop_options_s 没有被引用,我会收到警告在编译时,有没有一种方法可以在没有所有编译器警告的情况下使用它。
    【解决方案2】:

    使用X-Macro技术:

    文件items:

    ITEM(drop_ssm)
    ITEM(drop_snm)
    ITEM(drop_ssb)
    

    来源:

    #define ITEM(A) A,
    enum drop_options_e
    {
    #include "items"
    last
    };
    #undef ITEMS
    #define ITEM(A) #A,
    char item_names[] = {
    #include "items"
    NULL};
    

    所以现在item_names[drop_ssm] 会给你文本字符串"drop_ssm"

    【讨论】:

    • 这看起来是个不错的答案。但是,为简单起见,我将不得不选择 Naveen 的答案。
    【解决方案3】:

    C 对此不支持。您必须在某处有一个开关或等效设备。

    【讨论】:

      【解决方案4】:

      如果你有一个支持 C99 指定初始化器的编译器,你可以改进 Naveen's answer:

      enum drop_options_e
      {
          drop_ssm,
          drop_snm,
          drop_ssb
      };
      
      #define ENUM_TO_S(e) [e] = #e
      
      const char *drop_options_s[] = {
          ENUM_TO_S(drop_ssm),
          ENUM_TO_S(drop_snm),
          ENUM_TO_S(drop_ssb)
      };
      

      (使用此方法,您不必担心数组初始化器与枚举值的顺序相同)。

      【讨论】:

      • 使用 X-Macros 好多了
      【解决方案5】:

      没有什么是开箱即用的。您可以使用宏和 Boost.Preprocessor 做一些非常有趣的事情,但它涉及的内容很多,我不确定它在 C 中的效果如何;我用 C++ 完成了一些让我可以写的东西,例如:

      ENUM(
          ColorComponent,
          (red)
          (green)
          (blue)
          (alpha)
          );
      // ...
      ColorComponent cc = ColorComponent_red;
      std::cout << "Color: " << toString(cc) << "\n";
      

      【讨论】:

        【解决方案6】:

        我见过的最好的处理方法是创建一个翻译数组。比如:

        struct {
            enum drop_options_e value;
            char *string;
        } TranslationArray[] = {
            drop_ssm, "drop_ssm",
            drop_snm, "drop_snm",
            drop_ssb, "drop_ssb",
        };
        

        如果您的枚举非常大,这可能会出现问题。

        【讨论】:

          【解决方案7】:

          我非常喜欢这里的所有答案!在尝试它们的过程中,我发现 boost 中的 BOOST_PP_STRINGIZE 宏非常简短且不错:

          //Define the enum you need
          typedef enum
          {
          INTEGER = 0,
          STRING  = 1,
          BOOLEAN = 2,
          }eValueType;
          
          // Then in code use BOOST_PP_STRINGIZE, for example:
          char* valueTypeStr = BOOST_PP_STRINGIZE(INTEGER);
          

          【讨论】:

          • 这将打印INTEGER,为什么不只打印char* valueTypeStr = "INTEGER"
          猜你喜欢
          • 2023-03-04
          • 2010-09-30
          • 2017-05-07
          • 1970-01-01
          • 1970-01-01
          • 2023-03-10
          • 1970-01-01
          • 2017-03-16
          相关资源
          最近更新 更多