最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2023年02月23日 08:43:52   作者:西西弗Sisyphus  
本文主要介紹了C++/C關(guān)于#define的一些妙用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

1.數(shù)值類型輸出易讀的字符串形式

例如使用enum定義一些錯誤值,想要將數(shù)值類型的錯誤,輸出易讀的字符串形式

重要的一句代碼

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

可以看到 #val,宏定義中的傳入?yún)?shù)名val 轉(zhuǎn)換成字符串,就像用一對雙引號包含起來的val

完整實(shí)現(xiàn)代碼如下

#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.易記的簡化調(diào)用

例如有兩個函數(shù)

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;
}

這兩個函數(shù)很長,函數(shù)名前綴相同

想要易記的簡化調(diào)用

例如

CALL_MGR(A()); //實(shí)際調(diào)用ACameraManager_A()
CALL_MGR(B()); //實(shí)際調(diào)用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 后面的 \ 表示下一行繼續(xù)寫宏定義。

兩個#號 ## 表示連接操作符。 CALL_MGR(A());通過 ACameraManager_##func 變成了ACameraManager_A

實(shí)現(xiàn)完整代碼如下

#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

以上代碼應(yīng)用在google的ndk camera代碼中

到此這篇關(guān)于C/C++中#define的妙用分享的文章就介紹到這了,更多相關(guān)C++ #define內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 探討:將兩個鏈表非降序合并為一個鏈表并依然有序的實(shí)現(xiàn)方法

    探討:將兩個鏈表非降序合并為一個鏈表并依然有序的實(shí)現(xiàn)方法

    本篇文章是對將兩個鏈表非降序合并為一個鏈表并依然有序的實(shí)現(xiàn)方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C語言實(shí)現(xiàn)輸入ascii碼,輸出對應(yīng)的字符方式

    C語言實(shí)現(xiàn)輸入ascii碼,輸出對應(yīng)的字符方式

    這篇文章主要介紹了C語言實(shí)現(xiàn)輸入ascii碼,輸出對應(yīng)的字符方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • C語言宏定義容易認(rèn)不清的盲區(qū)梳理

    C語言宏定義容易認(rèn)不清的盲區(qū)梳理

    宏定義是C提供的三種預(yù)處理(宏定義、文件包含、條件編譯)的其中一種,其主要目的是為程序員在編程時提供一定的方便,并能在一定程度上提高程序的運(yùn)行效率
    2022-09-09
  • C++實(shí)現(xiàn)尋找最低公共父節(jié)點(diǎn)的方法

    C++實(shí)現(xiàn)尋找最低公共父節(jié)點(diǎn)的方法

    這篇文章主要介紹了C++實(shí)現(xiàn)尋找最低公共父節(jié)點(diǎn)的方法,是數(shù)據(jù)結(jié)構(gòu)中二叉樹的一個經(jīng)典算法,有一定的借鑒價值,需要的朋友可以參考下
    2014-09-09
  • C語言實(shí)現(xiàn)2048游戲(ege圖形庫版)

    C語言實(shí)現(xiàn)2048游戲(ege圖形庫版)

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)2048游戲,ege圖形庫版,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • ACE反應(yīng)器(Reactor)模式的深入分析

    ACE反應(yīng)器(Reactor)模式的深入分析

    本篇文章是對ACE反應(yīng)器(Reactor)模式進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C語言實(shí)現(xiàn)排雷游戲(多文件)

    C語言實(shí)現(xiàn)排雷游戲(多文件)

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)排雷游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • C++讀取到回車換行符問題處理

    C++讀取到回車換行符問題處理

    有一個程序只需對輸入的一行字符一個個進(jìn)行獨(dú)立判斷,C的話用getchar()就好了,但是用C++的時候發(fā)現(xiàn)CIN似乎不接受回車符……搜索解決方法的時候很多人都建議將getline,然后處理數(shù)組或者定義一個流什么的,但是這樣一行可能很長,要占用很多空間。有沒有別的辦法?
    2015-08-08
  • QT使用QComBox和QLineEdit實(shí)現(xiàn)模糊查詢功能

    QT使用QComBox和QLineEdit實(shí)現(xiàn)模糊查詢功能

    模糊查詢是指根據(jù)用戶輸入的文本,在下拉框的選項(xiàng)中進(jìn)行模糊匹配,并動態(tài)地顯示匹配的選項(xiàng),本文將使用QComBox和QLineEdit實(shí)現(xiàn)模糊查詢功能,需要的可以參考下
    2023-11-11
  • C語言編寫多功能日歷

    C語言編寫多功能日歷

    之前看到本站給大家分享了一則C語言實(shí)現(xiàn)的簡單日歷,就手癢了,也想自己寫一個,既然有簡單了,那咱寫個稍微復(fù)雜點(diǎn)的,多功能的吧。呵呵,玩笑玩笑
    2015-03-03

最新評論

齐齐哈尔市| 菏泽市| 长宁区| 佛教| 田东县| 蛟河市| 扎鲁特旗| 富阳市| 嵊州市| 沽源县| 葵青区| 剑川县| 大渡口区| 凤山县| 孝昌县| 济南市| 马鞍山市| 开鲁县| 噶尔县| 永城市| 昔阳县| 乡城县| 依安县| 蒲城县| 会昌县| 彩票| 江门市| 汾阳市| 余庆县| 五常市| 罗甸县| 西乌珠穆沁旗| 阿坝| 通城县| 油尖旺区| 沈丘县| 伊宁县| 淮安市| 平凉市| 徐汇区| 安化县|