伙伴云客服论坛»论坛 S区 S软件开发 查看内容

0 评论

0 收藏

分享

C/C++中#define的妙用分享

目录

    1.数值类型输出易读的字符串形式2.易记的简化调用


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

例如使用enum定义一些错误值,想要将数值类型的错误,输出易读的字符串形式
重要的一句代码
  1. #define MAKE_PAIR(val) std::make_pair(val, #val)
复制代码
可以看到 #val,宏定义中的传入参数名val 转换成字符串,就像用一对双引号包含起来的val
完好实现代码如下
  1. #include <iostream>
  2. #include <cinttypes>
  3. #include <string>
  4. #include <typeinfo>
  5. #include <utility>
  6. #include <vector>
  7. using namespace std;
  8. typedef enum {
  9.     ACAMERA_OK = 0,
  10.     ACAMERA_ERROR_BASE                  = -10000,
  11.     ACAMERA_ERROR_UNKNOWN               = ACAMERA_ERROR_BASE,
  12.     ACAMERA_ERROR_INVALID_PARAMETER     = ACAMERA_ERROR_BASE - 1,
  13.     ACAMERA_ERROR_CAMERA_DISCONNECTED   = ACAMERA_ERROR_BASE - 2,
  14. } camera_status_t;
  15. #define UKNOWN_TAG "UNKNOW_TAG"
  16. #define MAKE_PAIR(val) std::make_pair(val, #val)
  17. template <typename T>
  18. const char* GetPairStr(T key, std::vector<std::pair<T, const char*>>& store) {
  19.   typedef typename std::vector<std::pair<T, const char*>>::iterator iterator;
  20.   for (iterator it = store.begin(); it != store.end(); ++it) {
  21.     if (it->first == key) {
  22.       return it->second;
  23.     }
  24.   }
  25.   //LOGW("(%#08x) : UNKNOWN_TAG for %s", key, typeid(store[0].first).name());
  26.   return UKNOWN_TAG;
  27. }
  28. using ERROR_PAIR = std::pair<camera_status_t, const char*>;
  29. static std::vector<ERROR_PAIR> errorInfo{
  30.     MAKE_PAIR(ACAMERA_OK),
  31.     MAKE_PAIR(ACAMERA_ERROR_UNKNOWN),
  32.     MAKE_PAIR(ACAMERA_ERROR_INVALID_PARAMETER),
  33.     MAKE_PAIR(ACAMERA_ERROR_CAMERA_DISCONNECTED),
  34. };
  35. const char* GetErrorStr(camera_status_t err) {
  36.   return GetPairStr<camera_status_t>(err, errorInfo);
  37. }
  38. int main()
  39. {
  40.     std::cout<<GetErrorStr(ACAMERA_ERROR_INVALID_PARAMETER)<<std::endl;
  41.     return 0;
  42. }
复制代码
输出
ACAMERA_ERROR_INVALID_PARAMETER

2.易记的简化调用

例如有两个函数
  1. camera_status_t ACameraManager_A()
  2. {
  3.    std::cout<<"A"<<std::endl;
  4.    return ACAMERA_OK;
  5. }
  6. camera_status_t ACameraManager_B()
  7. {
  8.    std::cout<<"B"<<std::endl;
  9.    return ACAMERA_OK;
  10. }
复制代码
这两个函数很长,函数名前缀相同
想要易记的简化调用
例如
  1. CALL_MGR(A()); //实际调用ACameraManager_A()
  2. CALL_MGR(B()); //实际调用ACameraManager_B()
复制代码
  1. #define CALL_CAMERA(func)                                             \
  2.   {                                                                   \
  3.     camera_status_t status = func;                                    \
  4.     std::cout<<GetErrorStr(status)<<std::endl;                        \
  5.   }
  6. #define CALL_MGR(func) CALL_CAMERA(ACameraManager_##func)
复制代码
#define 后面的 \ 表示下一行继续写宏定义。
两个#号 ## 表示连接操作符。 CALL_MGR(A());通过 ACameraManager_##func 变成了ACameraManager_A
实现完好代码如下
  1. #include <iostream>
  2. #include <cinttypes>
  3. #include <string>
  4. #include <typeinfo>
  5. #include <utility>
  6. #include <vector>
  7. #include <assert.h>
  8. using namespace std;
  9. typedef enum {
  10.     ACAMERA_OK = 0,
  11.     ACAMERA_ERROR_BASE                  = -10000,
  12.     ACAMERA_ERROR_UNKNOWN               = ACAMERA_ERROR_BASE,
  13.     ACAMERA_ERROR_INVALID_PARAMETER     = ACAMERA_ERROR_BASE - 1,
  14.     ACAMERA_ERROR_CAMERA_DISCONNECTED   = ACAMERA_ERROR_BASE - 2,
  15. } camera_status_t;
  16. #define UKNOWN_TAG "UNKNOW_TAG"
  17. #define MAKE_PAIR(val) std::make_pair(val, #val)
  18. template <typename T>
  19. const char* GetPairStr(T key, std::vector<std::pair<T, const char*>>& store) {
  20.   typedef typename std::vector<std::pair<T, const char*>>::iterator iterator;
  21.   for (iterator it = store.begin(); it != store.end(); ++it) {
  22.     if (it->first == key) {
  23.       return it->second;
  24.     }
  25.   }
  26.   //LOGW("(%#08x) : UNKNOWN_TAG for %s", key, typeid(store[0].first).name());
  27.   return UKNOWN_TAG;
  28. }
  29. using ERROR_PAIR = std::pair<camera_status_t, const char*>;
  30. static std::vector<ERROR_PAIR> errorInfo{
  31.     MAKE_PAIR(ACAMERA_OK),
  32.     MAKE_PAIR(ACAMERA_ERROR_UNKNOWN),
  33.     MAKE_PAIR(ACAMERA_ERROR_INVALID_PARAMETER),
  34.     MAKE_PAIR(ACAMERA_ERROR_CAMERA_DISCONNECTED),
  35. };
  36. const char* GetErrorStr(camera_status_t err) {
  37.   return GetPairStr<camera_status_t>(err, errorInfo);
  38. }
  39. camera_status_t ACameraManager_A()
  40. {
  41.    std::cout<<"A"<<std::endl;
  42.    return ACAMERA_OK;
  43. }
  44. camera_status_t ACameraManager_B()
  45. {
  46.    std::cout<<"B"<<std::endl;
  47.    return ACAMERA_OK;
  48. }
  49. #define CALL_CAMERA(func)                                             \
  50.   {                                                                   \
  51.     camera_status_t status = func;                                    \
  52.     std::cout<<GetErrorStr(status)<<std::endl;                        \
  53.   }
  54. #define CALL_MGR(func) CALL_CAMERA(ACameraManager_##func)
  55. int main()
  56. {
  57.     CALL_MGR(A());
  58.     CALL_MGR(B());
  59.     return 0;
  60. }
复制代码
输出
A
ACAMERA_OK
B
ACAMERA_OK
以上代码应用在google的ndk camera代码中
到此这篇关于C/C++中#define的妙用分享的文章就介绍到这了,更多相关C++ #define内容请搜索网站以前的文章或继续阅读下面的相关文章希望大家以后多多支持网站!

回复

举报 使用道具

相关帖子
全部回复
暂无回帖,快来参与回复吧
本版积分规则 高级模式
B Color Image Link Quote Code Smilies

萌晓许
注册会员
主题 22
回复 14
粉丝 0
|网站地图
快速回复 返回顶部 返回列表