首页 > 解决方案 > 将 ctype 宏转换为 c++ 常量的方法

问题描述

我有一个 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++enumsnamespaces

解决方案


你可以用它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,
};

推荐阅读