将 CTYPE 宏转换为 C++ 常量的方法

method to convert ctype macros to c++ constants

本文关键字:常量 方法 C++ CTYPE 转换      更新时间:2023-10-16

我有一个 c++ 库,它定义了如下所示的宏,

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

#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 ++样式的枚举和静态常量呢?

您可以使用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,
};

选项 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;