【问题标题】:method to convert ctype macros to c++ constants将 ctype 宏转换为 c++ 常量的方法
【发布时间】:2018-05-11 17:57:42
【问题描述】:

我有一个 c++ 库,它定义了如下 MACROS,

/* 这里定义的是结果头文件*/

#define RESULT_ENUM( prefix, name, value )  prefix ## name = (value)

#define STATE_RESULT_LIST( prefix ) \
RESULT_ENUM( prefix, SUCCESS,                        0 ), \
RESULT_ENUM( prefix, PENDING,                        1 ),

#define COMMON_RESULT_LIST( prefix ) \
RESULT_ENUM( prefix, SUCCESS,                        0 ), \
RESULT_ENUM( prefix, PENDING,                        1 ),

typedef enum
{
  STATE_RESULT_LIST     ( STATE_          ) 
  COMMON_RESULT_LIST    ( CHANNEL_        )
}domain_result;

这就是它的使用方式

int main(int argc, char** argv) {
domain_result res = CHANNEL_SUCCESS;
cout<<STATE_SUCCESS <<endl;
cout<<CHANNEL_PENDING<<endl;
return 0;
}

大家建议不要使用宏,现在我不想修改c++源文件,只需要修改头文件。

那么如何将这些转换成 c++ 风格的枚举和静态常量呢?

【问题讨论】:

    标签: c++ enums namespaces


    【解决方案1】:

    您可以使用g++ -E 找出domain_result 最终是如何定义的。

    事实证明,所有这些都可以替换为:

    enum domain_result
    {
       STATE_SUCCESS = 0,
       STATE_PENDING = 1,
       CHANNEL_SUCCESS = 0,
       CHANNEL_PENDING = 1,
    };
    

    如果需要让enum 的所有标记都具有唯一值,您可以将其简化为:

    enum domain_result
    {
       STATE_SUCCESS, // = 0 by default.
       STATE_PENDING,
       CHANNEL_SUCCESS,
       CHANNEL_PENDING,
    };
    

    【讨论】:

    • 有更好的方法吗?就像分别定义两个枚举并将它们合并为一个,例如将 STATE 和 CHANNEL 放在单独的枚举中,然后将它们合并到 domain_result 中......!
    • @user3607698,我不确定什么是“更好”。除非您要处理很多这样的enums(我会经常遇到 10 个或更多),否则我认为您不必为此担心。
    • 枚举的类型定义?这是 c++,不是 c
    【解决方案2】:

    选项 1:

    enum domain_result : uint8_t
    {
        STATE_SUCCESS = 0,
        STATE_PENDING = 1,
        CHANNEL_SUCCESS = 0,
        CHANNEL_PENDING = 1,
    };
    

    选项 2:

    const uint8_t STATE_SUCCESS = 0;
    const uint8_t STATE_PENDING = 1;
    const uint8_t CHANNEL_SUCCESS = 0;
    const uint8_t CHANNEL_PENDING = 1;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-16
      相关资源
      最近更新 更多