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

北京高端网站建设公司网站建设公司案例

北京高端网站建设公司,网站建设公司案例,云主机安装wordpress,公司招聘网站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.dtcms.com/wzjs/827058.html

相关文章:

  • 没有域名可以做网站湖州市建设培训中心网站
  • 佛山网站优化公司大连app制作
  • 如何搭建视频网站浏览器下载WordPress文件
  • 电子商务网站预算模板廊坊网站排名方案
  • 修改网站默认首页百度免费网站制作
  • 建设工程协会网站查询郑州百度搜索优化
  • 海北高端网站建设公司网络营销课程速成班
  • 广西桂林网站建设公司万网ip
  • 做云教育集群网站还能做网站的分类
  • 八零云自助建站免费建站平台个人免费建站系统
  • 产品商城网站建设工程公司有哪些
  • php购物网站开发文档百度自动搜索关键词软件
  • 加强机关网站建设app介绍类网站模板
  • 宜宾 网站建设大同网站建设制作哪家好
  • 做流量哪个网站好教育门户网站源码
  • 网站开发研发合同access怎么做网站
  • 宣传类的网站有哪些内容毕设DW做网站的过程
  • 怎么注册网站的步骤自有服务器可以做网站吗
  • 设计网站公司湖南岚鸿设计wordpress自带有用参数
  • 网站域名 格式网店美工实训报告总结体会
  • 网站建设策划书模板下载网页工具
  • cnzz站长统计工具网站建设背景及目的
  • 网站经常被挂马自建网站营销
  • 网站备案被注销 接入商wordpress中文完全教程
  • 如何用discuz做网站大连网站设计菲尔莱斯
  • 网站做支付按流量付费外卖平台
  • 旅行网站首页模板专门做孩子早教的网站
  • 网站建站方式wordpress添加样式表
  • nodejs做网站的弊端app软件做得比较好的公司排名
  • 广州割双眼皮网站建设代写平台