当前位置: 首页 > news >正文

磁县邯郸网站建设手游推广平台

磁县邯郸网站建设,手游推广平台,美女做暧暧免费视频网站,青岛知名网站建设公司排名C/C 中#define 的妙用,让代码更美一些 flyfish 1 数值类型输出易读的字符串形式 例如使用enum定义一些错误值,想要将数值类型的错误,输出易读的字符串形式 重要的一句代码 #define MAKE_PAIR(val) std::make_pair(val, #val)可以看到 #va…

C/C++ 中#define 的妙用,让代码更美一些

flyfish

1 数值类型输出易读的字符串形式

例如使用enum定义一些错误值,想要将数值类型的错误,输出易读的字符串形式
重要的一句代码

#define MAKE_PAIR(val) std::make_pair(val, #val)

可以看到 #val,宏定义中的传入参数名val 转换成字符串,就像用一对双引号包含起来的val

完整实现代码如下

#include <iostream>
#include <cinttypes>
#include <string>
#include <typeinfo>
#include <utility>
#include <vector>
using namespace std;typedef enum {ACAMERA_OK = 0,ACAMERA_ERROR_BASE                  = -10000,ACAMERA_ERROR_UNKNOWN               = ACAMERA_ERROR_BASE,ACAMERA_ERROR_INVALID_PARAMETER     = ACAMERA_ERROR_BASE - 1,ACAMERA_ERROR_CAMERA_DISCONNECTED   = ACAMERA_ERROR_BASE - 2,} camera_status_t;#define UKNOWN_TAG "UNKNOW_TAG"
#define MAKE_PAIR(val) std::make_pair(val, #val)
template <typename T>
const char* GetPairStr(T key, std::vector<std::pair<T, const char*>>& store) {typedef typename std::vector<std::pair<T, const char*>>::iterator iterator;for (iterator it = store.begin(); it != store.end(); ++it) {if (it->first == key) {return it->second;}}//LOGW("(%#08x) : UNKNOWN_TAG for %s", key, typeid(store[0].first).name());return UKNOWN_TAG;
}
using ERROR_PAIR = std::pair<camera_status_t, const char*>;
static std::vector<ERROR_PAIR> errorInfo{MAKE_PAIR(ACAMERA_OK),MAKE_PAIR(ACAMERA_ERROR_UNKNOWN),MAKE_PAIR(ACAMERA_ERROR_INVALID_PARAMETER),MAKE_PAIR(ACAMERA_ERROR_CAMERA_DISCONNECTED),
};
const char* GetErrorStr(camera_status_t err) {return GetPairStr<camera_status_t>(err, errorInfo);
}int main()
{std::cout<<GetErrorStr(ACAMERA_ERROR_INVALID_PARAMETER)<<std::endl;return 0;
}

输出

ACAMERA_ERROR_INVALID_PARAMETER

2 易记的简化调用

例如有两个函数

camera_status_t ACameraManager_A()
{std::cout<<"A"<<std::endl;return ACAMERA_OK;
}camera_status_t ACameraManager_B()
{std::cout<<"B"<<std::endl;return ACAMERA_OK;
}

这两个函数很长,函数名前缀相同
想要易记的简化调用
例如

CALL_MGR(A()); //实际调用ACameraManager_A()
CALL_MGR(B()); //实际调用ACameraManager_B()
#define CALL_CAMERA(func)                                             \{                                                                   \camera_status_t status = func;                                    \std::cout<<GetErrorStr(status)<<std::endl;                        \}
#define CALL_MGR(func) CALL_CAMERA(ACameraManager_##func)

#define 后面的 \ 表示下一行继续写宏定义。
两个#号 ## 表示连接操作符。 CALL_MGR(A());通过 ACameraManager_##func 变成了ACameraManager_A
实现完整代码如下

#include <iostream>
#include <cinttypes>
#include <string>
#include <typeinfo>
#include <utility>
#include <vector>
#include <assert.h>
using namespace std;typedef enum {ACAMERA_OK = 0,ACAMERA_ERROR_BASE                  = -10000,ACAMERA_ERROR_UNKNOWN               = ACAMERA_ERROR_BASE,ACAMERA_ERROR_INVALID_PARAMETER     = ACAMERA_ERROR_BASE - 1,ACAMERA_ERROR_CAMERA_DISCONNECTED   = ACAMERA_ERROR_BASE - 2,} camera_status_t;#define UKNOWN_TAG "UNKNOW_TAG"
#define MAKE_PAIR(val) std::make_pair(val, #val)
template <typename T>
const char* GetPairStr(T key, std::vector<std::pair<T, const char*>>& store) {typedef typename std::vector<std::pair<T, const char*>>::iterator iterator;for (iterator it = store.begin(); it != store.end(); ++it) {if (it->first == key) {return it->second;}}//LOGW("(%#08x) : UNKNOWN_TAG for %s", key, typeid(store[0].first).name());return UKNOWN_TAG;
}
using ERROR_PAIR = std::pair<camera_status_t, const char*>;
static std::vector<ERROR_PAIR> errorInfo{MAKE_PAIR(ACAMERA_OK),MAKE_PAIR(ACAMERA_ERROR_UNKNOWN),MAKE_PAIR(ACAMERA_ERROR_INVALID_PARAMETER),MAKE_PAIR(ACAMERA_ERROR_CAMERA_DISCONNECTED),
};
const char* GetErrorStr(camera_status_t err) {return GetPairStr<camera_status_t>(err, errorInfo);
}camera_status_t ACameraManager_A()
{std::cout<<"A"<<std::endl;return ACAMERA_OK;
}
camera_status_t ACameraManager_B()
{std::cout<<"B"<<std::endl;return ACAMERA_OK;
}
#define CALL_CAMERA(func)                                             \{                                                                   \camera_status_t status = func;                                    \std::cout<<GetErrorStr(status)<<std::endl;                        \}
#define CALL_MGR(func) CALL_CAMERA(ACameraManager_##func)
int main()
{CALL_MGR(A());CALL_MGR(B());return 0;
}

输出

A
ACAMERA_OK
B
ACAMERA_OK

以上代码应用在google的ndk camera代码中

http://www.hrbkazy.com/news/17194.html

相关文章:

  • 大型门户网站模板qq推广引流怎么做
  • 小说网站静态模板最有效的100个营销方法
  • 光明新区做网站百度地图导航网页版
  • 河南省住房和城乡建设厅投诉网站企业网站推广方案设计
  • 北京做网站的公司拟软文标题例子
  • 天津专门做网站的公司营销推广费用预算表
  • 家居企业网站建设渠道最近国际时事热点事件
  • 衡阳县住房和城乡建设局网站竞价推广的企业
  • asp.net网站和空网站有什么区别宁德市人民医院
  • 成都网站建设赢展最新军事报道
  • 手机模板网站模板下载网站有哪些友情链接互换网站
  • 软件公司网站模板下载十大经典案例
  • 办公用品网站建设市场定位盐城seo排名
  • 西安网站开发公司电话网站死链检测工具
  • 英德市城乡建设局网站湖南网站排名
  • 资料库网站应该怎么做免费外链发布
  • 科普重庆网站互联网项目
  • 郑州哪有做网站的公司怎么开网站平台
  • wordpress office插件单页关键词优化费用
  • 黑色炫酷的监控网站html引流app推广软件
  • 网站背景css宁波优化网页基本流程
  • 如何使用axure做网站手机百度seo怎么优化
  • 自己如何做棋牌网站线上网络平台推广
  • 用什么做网站更快捷方便湖南seo快速排名
  • 上海网络seo外包公司需要什么
  • 聊城网站网站建设湖北荆门今日头条
  • 网络营销方式一般有济南seo网站关键词排名
  • 网站建设品牌策苏州seo快速优化
  • 政府网站建设情况查网站权重
  • 专业做网站优化价格武汉网站seo服务