頭文件+宏,完美解決聲明函數(shù)問題!
一、前言
我們平常在寫代碼的時候,特別是在制造輪子的時候(為別人提供庫文件),會遇到各種不同的需求場景:
有些人需要在 Linux 系統(tǒng)下使用,有些人需要在 Windows 系統(tǒng)下使用;有些人使用 C 語言開發(fā),有些人使用 C++ 來開發(fā);有些人使用動態(tài)庫,有些人使用靜態(tài)庫;
特別是在 Windows 系統(tǒng)中,庫文件中導(dǎo)出的函數(shù)需要使用 _declspec(dllexport) 來聲明函數(shù),而使用者在導(dǎo)入的時候,需要使用 _declspec(dllimport) 來聲明函數(shù),甚是麻煩!
這篇短文分享一個頭文件,利用這個頭文件,再加上幾個編譯期間傳遞的宏,就可以完美的處理剛才所說的各種需求。
二、頭文件
先直接上代碼,可以先試著分析一下,后面我們再逐一分析不同的使用場景。
這個頭文件的主要目的,就是定義一個宏:MY_API,然后把這個宏添加在庫文件中每一個需要導(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è)需要寫一個庫文件,提供給別人使用。定義了上面這個頭文件之后,其他的文件中都要 include 這個頭文件。
1. 平臺宏定義
不同的平臺預(yù)定義了相應(yīng)的宏定義,例如:
Windows 平臺:WIN32, _WIN32, WIN32;
Linux 平臺:linux, __linux, linux;
在一個確定的平臺上,這些宏不一定全部定義,很可能只有其中的某一個宏是被定義的。
為了統(tǒng)一性,我們在頭文件的剛開始部分,把這些可能的宏統(tǒng)一起來,定義我們出我們自己的平臺宏定義:MY_WIN32 或者是 MY_LINUX,后面需要區(qū)分不同的平臺時,就用這個自己定義的平臺宏。
當(dāng)然,還可以繼續(xù)擴(kuò)充出其他平臺,例如:MY_M(jìn)AC, MY_ARM 等等。
請輸入評論內(nèi)容...
請輸入評論/評論長度6~500個字
最新活動更多
-
11月20日火熱報名中>> 2024 智能家居出海論壇
-
11月28日立即報名>>> 2024工程師系列—工業(yè)電子技術(shù)在線會議
-
12月19日立即報名>> 【線下會議】OFweek 2024(第九屆)物聯(lián)網(wǎng)產(chǎn)業(yè)大會
-
即日-12.26火熱報名中>> OFweek2024中國智造CIO在線峰會
-
即日-2025.8.1立即下載>> 《2024智能制造產(chǎn)業(yè)高端化、智能化、綠色化發(fā)展藍(lán)皮書》
-
精彩回顧立即查看>> 【在線會議】多物理場仿真助跑新能源汽車
推薦專題
- 1 從“AI四小龍”看“六小虎”,大模型獨角獸難破盈利困局
- 2 腦機接口芯片,華為出了新專利!
- 3 大語言模型會不會成為即將破碎的AI泡沫?
- 4 格創(chuàng)東智入選IDC權(quán)威報告,AI創(chuàng)新成果多領(lǐng)域領(lǐng)先
- 5 高管輪崗機制,給百度帶來了什么?
- 6 今年諾獎對人工智能的重視,給我們的基礎(chǔ)教育提了個醒
- 7 銀行業(yè)AI大模型,從入局到求變
- 8 巨頭搶布局,VC狂撒錢,為了能讓「AI讀心」這些公司卷瘋了
- 9 阿斯麥ASML:“骨折級”洋相,又成AI第一殺手?
- 10 蘋果市值創(chuàng)新高,iPhone 16能否助力突破4萬億美元大關(guān)?
- 高級軟件工程師 廣東省/深圳市
- 自動化高級工程師 廣東省/深圳市
- 光器件研發(fā)工程師 福建省/福州市
- 銷售總監(jiān)(光器件) 北京市/海淀區(qū)
- 激光器高級銷售經(jīng)理 上海市/虹口區(qū)
- 光器件物理工程師 北京市/海淀區(qū)
- 激光研發(fā)工程師 北京市/昌平區(qū)
- 技術(shù)專家 廣東省/江門市
- 封裝工程師 北京市/海淀區(qū)
- 結(jié)構(gòu)工程師 廣東省/深圳市