手机网站商城建设答辩问题,我想注册公司怎么注册,河东网站建设,wordpress怎样安装主题C/C 中#define 的妙用#xff0c;让代码更美一些
flyfish
1 数值类型输出易读的字符串形式
例如使用enum定义一些错误值#xff0c;想要将数值类型的错误#xff0c;输出易读的字符串形式 重要的一句代码
#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::vectorstd::pairT, const char* store) {typedef typename std::vectorstd::pairT, 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::paircamera_status_t, const char*;
static std::vectorERROR_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 GetPairStrcamera_status_t(err, errorInfo);
}int main()
{std::coutGetErrorStr(ACAMERA_ERROR_INVALID_PARAMETER)std::endl;return 0;
}输出
ACAMERA_ERROR_INVALID_PARAMETER2 易记的简化调用
例如有两个函数
camera_status_t ACameraManager_A()
{std::coutAstd::endl;return ACAMERA_OK;
}camera_status_t ACameraManager_B()
{std::coutBstd::endl;return ACAMERA_OK;
}这两个函数很长函数名前缀相同 想要易记的简化调用 例如
CALL_MGR(A()); //实际调用ACameraManager_A()
CALL_MGR(B()); //实际调用ACameraManager_B()#define CALL_CAMERA(func) \{ \camera_status_t status func; \std::coutGetErrorStr(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::vectorstd::pairT, const char* store) {typedef typename std::vectorstd::pairT, 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::paircamera_status_t, const char*;
static std::vectorERROR_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 GetPairStrcamera_status_t(err, errorInfo);
}camera_status_t ACameraManager_A()
{std::coutAstd::endl;return ACAMERA_OK;
}
camera_status_t ACameraManager_B()
{std::coutBstd::endl;return ACAMERA_OK;
}
#define CALL_CAMERA(func) \{ \camera_status_t status func; \std::coutGetErrorStr(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代码中