c++ - 将 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++ 样式的枚举和静态常量。?
解决方案
你可以用它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,
};
推荐阅读
- sorting - SwiftUI - 选择器 .onChange 和 didSet
- javascript - Excel Office 脚本 - 尝试推送 2D 数组时出错
- c# - C#在foreach循环中修改列表项
- scala - 在 Scala 中同时访问实用程序函数
- postgresql - PostgreSQL Trigram 索引与 btree
- typescript - TypeScript:我如何打开 Maybe
类型? - docker - Docker“工件映像”与“服务映像”与“单个 FROM 映像”与“多个 FROM 映像”
- javascript - 如何从外部组件调用 Quasar 对话框?
- javascript - 使用 javascript 转换为 json 的类 Unix 路径
- python - 错误:QQmlApplicationEngine 无法加载组件“网络问题”