訂閱
糾錯(cuò)
加入自媒體

頭文件+宏,完美解決聲明函數(shù)問(wèn)題!

一、前言

我們平常在寫(xiě)代碼的時(shí)候,特別是在制造輪子的時(shí)候(為別人提供庫(kù)文件),會(huì)遇到各種不同的需求場(chǎng)景:

有些人需要在 Linux 系統(tǒng)下使用,有些人需要在 Windows 系統(tǒng)下使用;有些人使用 C 語(yǔ)言開(kāi)發(fā),有些人使用 C++ 來(lái)開(kāi)發(fā);有些人使用動(dòng)態(tài)庫(kù),有些人使用靜態(tài)庫(kù);

特別是在 Windows 系統(tǒng)中,庫(kù)文件中導(dǎo)出的函數(shù)需要使用 _declspec(dllexport)  來(lái)聲明函數(shù),而使用者在導(dǎo)入的時(shí)候,需要使用 _declspec(dllimport) 來(lái)聲明函數(shù),甚是麻煩!

這篇短文分享一個(gè)頭文件,利用這個(gè)頭文件,再加上幾個(gè)編譯期間傳遞的宏,就可以完美的處理剛才所說(shuō)的各種需求。

二、頭文件

先直接上代碼,可以先試著分析一下,后面我們?cè)僦鹨环治霾煌氖褂脠?chǎng)景。

這個(gè)頭文件的主要目的,就是定義一個(gè)宏:MY_API,然后把這個(gè)宏添加在庫(kù)文件中每一個(gè)需要導(dǎo)出的函數(shù)或者類的聲明中即可。例如:

void MY_API do_work();

下面是頭文件:

_Pragma("once")
#if defined(WIN32) || defined(_WIN32) || defined(__WIN32__)
   #define MY_WIN32
#elif defined(linux) || defined(__linux) || defined(__linux__)
   #define MY_LINUX
#endif
#if defined(MY_WIN32)
   #ifdef MY_API_STATIC
     #ifdef __cplusplus
        #define MY_API extern "C"
     #else
        #define MY_API
     #endif
  #else
     #ifdef MY_API_EXPORTS
        #ifdef __cplusplus
           #define MY_API extern "C" __declspec(dllexport)
        #else
           #define MY_API __declspec(dllexport)
        #endif
     #else
        #ifdef __cplusplus
           #define MY_API extern "C" __declspec(dllimport)
        #else
           #define MY_API __declspec(dllimport)
        #endif
     #endif
  #endif
#elif defined(MY_LINUX)
   #ifdef __cplusplus
      #define MY_API extern "C"
   #else
      #define MY_API
   #endif
#endif

三、預(yù)定義的宏

假設(shè)需要寫(xiě)一個(gè)庫(kù)文件,提供給別人使用。定義了上面這個(gè)頭文件之后,其他的文件中都要 include 這個(gè)頭文件。

1. 平臺(tái)宏定義

不同的平臺(tái)預(yù)定義了相應(yīng)的宏定義,例如:

Windows 平臺(tái):WIN32, _WIN32, WIN32;
Linux 平臺(tái):linux, __linux, linux;

在一個(gè)確定的平臺(tái)上,這些宏不一定全部定義,很可能只有其中的某一個(gè)宏是被定義的。

為了統(tǒng)一性,我們?cè)陬^文件的剛開(kāi)始部分,把這些可能的宏統(tǒng)一起來(lái),定義我們出我們自己的平臺(tái)宏定義:MY_WIN32 或者是 MY_LINUX,后面需要區(qū)分不同的平臺(tái)時(shí),就用這個(gè)自己定義的平臺(tái)宏。

當(dāng)然,還可以繼續(xù)擴(kuò)充出其他平臺(tái),例如:MY_M(jìn)AC, MY_ARM 等等。

1  2  下一頁(yè)>  
聲明: 本文由入駐維科號(hào)的作者撰寫(xiě),觀點(diǎn)僅代表作者本人,不代表OFweek立場(chǎng)。如有侵權(quán)或其他問(wèn)題,請(qǐng)聯(lián)系舉報(bào)。

發(fā)表評(píng)論

0條評(píng)論,0人參與

請(qǐng)輸入評(píng)論內(nèi)容...

請(qǐng)輸入評(píng)論/評(píng)論長(zhǎng)度6~500個(gè)字

您提交的評(píng)論過(guò)于頻繁,請(qǐng)輸入驗(yàn)證碼繼續(xù)

  • 看不清,點(diǎn)擊換一張  刷新

暫無(wú)評(píng)論

暫無(wú)評(píng)論

    掃碼關(guān)注公眾號(hào)
    OFweek人工智能網(wǎng)
    獲取更多精彩內(nèi)容
    文章糾錯(cuò)
    x
    *文字標(biāo)題:
    *糾錯(cuò)內(nèi)容:
    聯(lián)系郵箱:
    *驗(yàn) 證 碼:

    粵公網(wǎng)安備 44030502002758號(hào)