我有一个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 ++样式的枚举和静态常量。?
答案 0 :(得分:2)
您可以使用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 :(得分:1)
选项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;