欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

重要的一句代碼

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

可以看到 #val,宏定義中的傳入?yún)?shù)名val 轉(zhuǎn)換成字符串,就像用一對(duì)雙引號(hào)包含起來的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.易記的簡(jiǎn)化調(diào)用

例如有兩個(gè)函數(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;
}

這兩個(gè)函數(shù)很長(zhǎng),函數(shù)名前綴相同

想要易記的簡(jiǎn)化調(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ù)寫宏定義。

兩個(gè)#號(hào) ## 表示連接操作符。 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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • QT實(shí)現(xiàn)多文件拖拽獲取路徑的方法

    QT實(shí)現(xiàn)多文件拖拽獲取路徑的方法

    這篇文章主要為大家詳細(xì)介紹了QT實(shí)現(xiàn)多文件拖拽獲取路徑的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • C++設(shè)計(jì)模式編程之Flyweight享元模式結(jié)構(gòu)詳解

    C++設(shè)計(jì)模式編程之Flyweight享元模式結(jié)構(gòu)詳解

    這篇文章主要介紹了C++設(shè)計(jì)模式編程的Flyweight享元模式結(jié)構(gòu),享元模式在實(shí)現(xiàn)過程中主要是要為共享對(duì)象提供一個(gè)存放的"倉庫"(對(duì)象池),需要的朋友可以參考下
    2016-03-03
  • 進(jìn)程間通信之深入消息隊(duì)列的詳解

    進(jìn)程間通信之深入消息隊(duì)列的詳解

    本篇文章是對(duì)消息隊(duì)列的應(yīng)用進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C語言函數(shù)的基本使用和遞歸小結(jié)

    C語言函數(shù)的基本使用和遞歸小結(jié)

    這篇文章主要介紹了C語言函數(shù)的基本使用和遞歸小結(jié),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-09-09
  • C語言實(shí)現(xiàn)日期和時(shí)間處理的常用函數(shù)總結(jié)

    C語言實(shí)現(xiàn)日期和時(shí)間處理的常用函數(shù)總結(jié)

    在C語言中,時(shí)間和日期處理是一項(xiàng)非?;A(chǔ)的技能,也是開發(fā)實(shí)際應(yīng)用程序時(shí)經(jīng)常會(huì)用到的功能,本文為大家總結(jié)了C語言中一些常用的時(shí)間庫函數(shù),希望對(duì)大家有所幫助
    2023-06-06
  • 淺談返回函數(shù)內(nèi)部new分配的內(nèi)存的引用

    淺談返回函數(shù)內(nèi)部new分配的內(nèi)存的引用

    下面小編就為大家?guī)硪黄獪\談返回函數(shù)內(nèi)部new分配的內(nèi)存的引用。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-12-12
  • C++面試題之進(jìn)制轉(zhuǎn)換的實(shí)例

    C++面試題之進(jìn)制轉(zhuǎn)換的實(shí)例

    這篇文章主要介紹了C++面試題之進(jìn)制轉(zhuǎn)換的實(shí)例的相關(guān)資料,希望通過本文能幫助到大家,讓大家理解掌握這樣的知識(shí),需要的朋友可以參考下
    2017-10-10
  • C語言封裝函數(shù)字符串練習(xí)匯總分享

    C語言封裝函數(shù)字符串練習(xí)匯總分享

    這篇文章主要介紹了C語言封裝函數(shù)字符串練習(xí)匯總分享,分享內(nèi)容有字符串查找、字符串拼接、字符串轉(zhuǎn)整數(shù)等內(nèi)容,需要而小伙伴可以參考一下
    2022-03-03
  • C++類的繼承和派生及指針安全引用

    C++類的繼承和派生及指針安全引用

    這篇文章主要介紹了C++類的繼承和派生及指針安全引用,繼承指從現(xiàn)有類獲得其特性,派生指從已有類產(chǎn)生新的類,指針和引用并存,二者似乎有很多相同點(diǎn),但是又不完全相同,下面關(guān)于兩者的相關(guān)資料,需要的小伙伴可以參考一下
    2022-03-03
  • C++中LibCurl庫使用流程及配置詳解

    C++中LibCurl庫使用流程及配置詳解

    libcurl是一個(gè)跨平臺(tái)的開源網(wǎng)絡(luò)傳輸庫,它支持許多協(xié)議,包括HTTP、HTTPS、FTP、FTPS以及許多其他協(xié)議和文件傳輸方式,本文給大家詳細(xì)介紹了C++中LibCurl庫使用流程及配置,需要的朋友可以參考下
    2024-02-02

最新評(píng)論