将 CTYPE 宏转换为 C++ 常量的方法
method to convert ctype macros to c++ constants
我有一个 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;
相关文章:
- 为什么常量方法可以采用非常量引用?
- 常量方法中的非常量 lambda 捕获
- Gmock 常量方法不调用,而是调用原始方法
- 为什么我们需要常量方法?
- 模板常量/非常量方法
- 在常量方法中调用非常量方法
- 如何让编译器在C++中更喜欢常量方法重载?
- 常量方法中 decltype 的结果
- 如何从QDialog的常量方法显示QMessageBox?
- 常量方法指针的类型是什么
- C++类的常量方法中将字符数组分配给 T* 的方法
- 在公共常量方法中访问私有成员
- 常量方法中的奇怪行为,其中变量可以修改
- 当函数引用对象(并访问非常量方法)时,如何抛弃常量?
- 非常量指针成员上的C++常量方法
- 从 const 方法调用成员上的非常量方法
- "Reference qualifier correctness"还是应该将非常量方法应用于右值?
- 在Turtle中为常量方法创建Mock
- C++模板来覆盖常量和非常量方法
- 单元测试-在C++TDD中调用重载常量与非常量方法的好方法