激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語(yǔ)言|JavaScript|易語(yǔ)言|vb.net|

服務(wù)器之家 - 編程語(yǔ)言 - C/C++ - C語(yǔ)言邊角料5:一個(gè)跨平臺(tái)的頭文件

C語(yǔ)言邊角料5:一個(gè)跨平臺(tái)的頭文件

2021-03-31 23:31IOT物聯(lián)網(wǎng)小鎮(zhèn)道哥 C/C++

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

C語(yǔ)言邊角料5:一個(gè)跨平臺(tái)的頭文件

一、前言

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

  1. 有些人需要在 Linux 系統(tǒng)下使用,有些人需要在 Windows 系統(tǒng)下使用;
  2. 有些人使用 C 語(yǔ)言開發(fā),有些人使用 C++ 來(lái)開發(fā);
  3. 有些人使用動(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ù)或者類的聲明中即可。例如:

  1. void MY_API do_work(); 

下面是頭文件:

  1. _Pragma("once"
  2.  
  3. #if defined(WIN32) || defined(_WIN32) || defined(__WIN32__) 
  4.     #define MY_WIN32 
  5. #elif defined(linux) || defined(__linux) || defined(__linux__) 
  6.     #define MY_LINUX 
  7. #endif 
  8.  
  9. #if defined(MY_WIN32) 
  10.     #ifdef MY_API_STATIC 
  11.       #ifdef __cplusplus 
  12.          #define MY_API extern "C" 
  13.       #else 
  14.          #define MY_API 
  15.       #endif 
  16.    #else 
  17.       #ifdef MY_API_EXPORTS 
  18.          #ifdef __cplusplus 
  19.             #define MY_API extern "C" __declspec(dllexport) 
  20.          #else 
  21.             #define MY_API __declspec(dllexport) 
  22.          #endif 
  23.       #else 
  24.          #ifdef __cplusplus 
  25.             #define MY_API extern "C" __declspec(dllimport) 
  26.          #else 
  27.             #define MY_API __declspec(dllimport) 
  28.          #endif 
  29.       #endif 
  30.    #endif 
  31. #elif defined(MY_LINUX) 
  32.     #ifdef __cplusplus 
  33.        #define MY_API extern "C" 
  34.     #else 
  35.        #define MY_API 
  36.     #endif 
  37. #endif 

三、預(yù)定義的宏

假設(shè)需要寫一個(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è)陬^文件的剛開始部分,把這些可能的宏統(tǒng)一起來(lái),定義我們出我們自己的平臺(tái)宏定義:MY_WIN32 或者是 MY_LINUX,后面需要區(qū)分不同的平臺(tái)時(shí),就用這個(gè)自己定義的平臺(tái)宏。

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

2. 編譯器宏定義

如果在寫庫(kù)代碼的時(shí)候,使用的是 C++,而使用者使用的是 C 語(yǔ)言,那么就需要對(duì)庫(kù)函數(shù)進(jìn)行extern “C” 聲明,讓編譯器不要對(duì)函數(shù)的名稱進(jìn)行改寫。

編譯器 g++ 預(yù)定義了宏 __cplusplus,因此,在頭文件中,就利用了這個(gè)宏,在 MY_API 中添加 extern "C" 聲明。

四、Windows 平臺(tái)場(chǎng)景分析

1. 編譯生成庫(kù)文件

(1) 生成靜態(tài)庫(kù)

在靜態(tài)庫(kù)中,不需要 __declspec(dllexport/dllimport) 的聲明,因此只需要區(qū)分編譯器即可(gcc or g++),在編譯選項(xiàng)中定義宏 MY_API_STATIC,即可得到最終的 MY_API 為:

  • gcc 編譯器:#define MY_API
  • g++ 編譯器:#define MY_API extern "C"

(2) 生成動(dòng)態(tài)庫(kù)

在編譯選項(xiàng)中,定義宏 MY_API_EXPORTS,這樣最終得到的 MY_API 就會(huì)變成:

  • gcc 編譯器:#define MY_API __declspec(dllexport)
  • g++ 編譯器:#define MY_API extern "C" __declspec(dllexport)

2. 使用庫(kù)

在使用庫(kù)的應(yīng)用程序中,也需要在代碼中 include 這個(gè)頭文件,然后加上編譯選項(xiàng)中定義的各種宏,來(lái)生成對(duì)應(yīng)的 MY_API 宏定義。

(1) 使用靜態(tài)庫(kù)

需要在編譯選項(xiàng)中定義 MY_API_STATIC,即可得到最終的 MY_API 為:

  • gcc 編譯器:#define MY_API
  • g++ 編譯器:#define MY_API extern "C"

(2) 使用動(dòng)態(tài)庫(kù)

在編譯選項(xiàng)中不需要任何宏定義,即可得到最終的 MY_API 為:

  • gcc 編譯器:#define MY_API extern "C" __declspec(dllimport)
  • g++ 編譯器:#define MY_API __declspec(dllimport)

這樣就相當(dāng)于聲明導(dǎo)入庫(kù)函數(shù)了。

五、Linux 平臺(tái)場(chǎng)景分析

Linux 平臺(tái)下就簡(jiǎn)單多了,只需要注意編譯器的問(wèn)題,而沒(méi)有導(dǎo)出和導(dǎo)入之分。

原文地址:https://mp.weixin.qq.com/s/N6Ome9vs9OEocqdWv-MfEw

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 黄色片免费看网站 | 毛片三区| 欧美特黄一级高清免费的香蕉 | 91精品成人福利在线播放 | 国产精品久久99精品毛片三a | 精品国产亚洲人成在线 | 中文在线国产 | 黄色网址在线免费播放 | 国产xxxx免费 | 亚州欧美视频 | 亚洲午夜久久久精品一区二区三区 | 国产精品一区二区三区99 | 色中色激情影院 | 成人午夜视频免费看 | 黄色18网站 | 久久精品视频首页 | 久久久久夜色精品国产老牛91 | 日韩激情一区 | 成人黄色免费电影 | 中文字幕在线观看免费视频 | 宅男噜噜噜66一区二区 | 91情侣在线偷精品国产 | 日韩视频在线一区二区三区 | 国产91片| 国产成人网| 黑人一级片| 红杏网站永久免费视频入口 | 国产69精品久久99不卡免费版 | 成年人精品视频 | 欧美精品一区二区视频 | 一级电影免费在线观看 | 日韩视频在线不卡 | 精品国产96亚洲一区二区三区 | 天天色综合2 | 羞羞的动漫在线观看 | xxxxhd18hd日本hd| 久久网综合 | 欧美精品电影一区二区 | 男人久久天堂 | 一级国产精品一级国产精品片 | 国产午夜精品久久久久久免费视 |