精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

詳解跨平臺代碼的3種組織方式

開發(fā)
我們在源代碼中也會遇到一些跨平臺的問題。不同的功能,在不同的平臺下,實現(xiàn)方式是不一樣的,如何對這些平臺相關(guān)的代碼進行組織呢?這篇文章就來聊聊這個問題。

[[390799]]

一、緣起

在上一篇文章中,分享了一個跨平臺的頭文件是長成什么樣子的,這個頭文件對于 windows 平臺下更有意義一些,因為要處理庫函數(shù)的導(dǎo)入和導(dǎo)出聲明(dllexport、dllimport)。

其實,可以在這個頭文件的基礎(chǔ)上繼續(xù)擴充,以達(dá)到更細(xì)粒度的控制。例如:對編譯器的判斷、對編譯器版本的判斷等等。

同樣的,我們在源代碼中也會遇到一些跨平臺的問題。不同的功能,在不同的平臺下,實現(xiàn)方式是不一樣的,如何對這些平臺相關(guān)的代碼進行組織呢?這篇文章就來聊聊這個問題。

PS: 文末提供了一個簡單的、跨平臺構(gòu)建代碼示例。

二、問題引入

假設(shè)我們寫一個庫,需要實現(xiàn)一個函數(shù):獲取系統(tǒng)時間戳。作為實現(xiàn)庫的作者,你決定提供下面的 API 函數(shù):

  1. t_time.h: 聲明接口函數(shù)(t_get_timestamp); 
  2. t_time.c:實現(xiàn)接口函數(shù); 

下面的任務(wù)就是在函數(shù)實現(xiàn)中,通過不同下的 C 庫或系統(tǒng)調(diào)用,來計算系統(tǒng)當(dāng)前的時間戳。

在 Linux 平臺下,可以通過下面這段代碼實現(xiàn):

  1. struct timeval tv; 
  2. gettimeofday(&tv, null); 
  3. return tv.tv_sec * 1000 + tv.tv_usec / 1000; 

在 Windows 平臺下,可以通過下面這段代碼實現(xiàn):

  1. struct timeb tp; 
  2. ftime(&tp); 
  3. return tp.time *1000 + tp.millitm; 

那么問題來了:怎么把這兩段平臺相關(guān)的代碼組織在一起?下面就介紹 3 種不同的組織方式,沒有優(yōu)劣之分,每個人都有不同的習(xí)慣,選擇適合自己和團隊的方式就行。

此外,這個示例中只有 1 個函數(shù),而且比較短小。如果這種跨平臺的函數(shù)很多、而且都很長,也許你的選擇又不一樣了。

三、三個解決方案

方案1

直接在接口函數(shù)中,通過平臺宏定義來區(qū)分不同平臺。

平臺宏定義(T_LINUX, T_WINDOWS),是在上一篇文章中介紹的,通過操作系統(tǒng)、編譯器來判斷當(dāng)前的平臺是什么,然后定義出統(tǒng)一的平臺宏定義為我們自己所用:

代碼組織方式如下:

  1. int64 t_get_timestamp() 
  2.     int64 ts = -1; 
  3.      
  4. #if defined(T_LINUX) 
  5.     struct timeval tv; 
  6.     gettimeofday(&tv, null); 
  7.     ts = tv.tv_sec * 1000 + tv.tv_usec / 1000; 
  8. #elif defined(T_WINDOWS) 
  9.     struct timeb tp; 
  10.     ftime(&tp); 
  11.     ts = tp.time
  12.     ts = ts *1000 + tp.millitm; 
  13. #endif 
  14.  
  15.     return ts; 

這樣的方式,把所有平臺代碼全部放在 API 函數(shù)中了,通過平臺宏定義進行條件編譯,因為代碼比較短小,看起來還不錯。

方案2

把不同平臺的實現(xiàn)代碼放在獨立的文件中,然后通過 #include 預(yù)處理符號,在 API 函數(shù)中,把平臺相關(guān)的代碼引入進來。

也就是再增加 2 個文件:

  1. t_time_linux.c:存放 Linux 平臺下的代碼實現(xiàn); 
  2. t_time_windows.c:存放 Windows 平臺下的代碼實現(xiàn); 

(1) t_time_linux.c

  1. #include "t_time.h" 
  2. #include <sys/time.h> 
  3.  
  4. int64 t_get_timestamp() 
  5.     int64 ts = -1; 
  6.      
  7.     struct timeval tv; 
  8.     gettimeofday(&tv, null); 
  9.     ts = tv.tv_sec * 1000 + tv.tv_usec / 1000; 
  10.      
  11.     return ts; 

(2) t_time_windows.c

  1. #include "t_time.h" 
  2. #include <windows.h> 
  3. #include <sys/timeb.h> 
  4.  
  5. int64 t_get_timestamp() 
  6.     int64 ts = -1; 
  7.      
  8.     struct timeb tp; 
  9.     ftime(&tp); 
  10.     ts = tp.time
  11.     ts = ts *1000 + tp.millitm; 
  12.  
  13.     return ts; 

(3) t_time.c

這個文件不做任何事情,僅僅是 include 其他的代碼。

  1. #include "t_time.h" 
  2.  
  3. #if defined(T_LINUX) 
  4. #include <t_time_linux.c> 
  5. #elif defined(T_WINDOWS) 
  6. #include <t_time_windows.c> 
  7. #else 
  8. int64 t_get_timestamp() 
  9.     return -1; 
  10. #endif 

有些人比較反感這樣的組織方式,一般都是 include 一個 .h 頭文件,而這里通過平臺宏定義,include 不同的 .c 源文件,感覺怪怪的?!

其實,也有一些開源庫是這么干的,比如下面:

方案3

在上面方案2中,是在源代碼中填入不同平臺的實現(xiàn)代碼。

其實可以換一種思路,既然已經(jīng)根據(jù)平臺的不同、放在不同的文件中了,那么可以讓不同的源文件加入到編譯過程中就可以了。

測試代碼是使用 cmake 工具來構(gòu)建的,因此可以編輯 CMakelists.txt 文件,來控制參與編譯的源文件。

CMakelists.txt 文件部分內(nèi)容

  1. # 設(shè)置平臺變量 
  2. if (CMAKE_SYSTEM_NAME MATCHES "Linux"
  3. set(PLATFORM linux) 
  4. elseif (CMAKE_SYSTEM_NAME MATCHES "Windows"
  5. set(PLATFORM windows) 
  6. endif() 
  7.  
  8. # 根據(jù)平臺變量,來編譯不同的源文件 
  9. set(LIBSRC  t_time_${PLATFORM}.c) 

這樣的組織方式,感覺代碼更“干凈”一些。同樣的,我們也可以看到一些開源庫也是這么做的:

四、One More Thing

為了文章的篇幅,以上只是貼了代碼的片段。

我寫了一個最簡單的 demo,使用 cmake 來構(gòu)建跨平臺的動態(tài)庫、靜態(tài)庫、可執(zhí)行程序。寫這個 demo 的目的,主要是作為一個外殼,來測試一些寫文章時的代碼。

在 Linux 平臺下,通過 cmake 指令手動編譯;在 Windows 平臺下,可以通過 CLion 集成開發(fā)環(huán)境直接編譯、執(zhí)行,也可以通過 cmake 工具直接生成 VS2017/2019 解決方案。

已經(jīng)把這個 demo 放在 gitee 倉庫中了,感興趣的小伙伴,請在公眾號回復(fù):dg36,即可收到克隆地址。

 

責(zé)任編輯:姜華 來源: IOT物聯(lián)網(wǎng)小鎮(zhèn)
相關(guān)推薦

2012-07-06 15:08:14

跨平臺工具Netbiscuits

2012-07-06 15:00:03

跨平臺工具MoSync

2012-07-06 15:03:43

跨平臺工具Ideaworks 3Marmalade

2012-06-14 09:42:20

跨平臺工具AppceleratoTitanium

2012-06-14 09:57:12

跨平臺工具IBMWorklight

2012-07-06 14:02:25

跨平臺工具RunRevLiveCode

2012-06-14 09:48:06

跨平臺工具SeregonDragonRad

2012-07-06 15:10:39

跨平臺工具QtNokia

2012-07-06 13:50:44

跨平臺工具Adobe Phone

2024-11-11 08:00:00

2020-02-18 20:00:31

PostgreSQL數(shù)據(jù)庫

2012-07-06 13:45:21

跨平臺工具Adobe AirFlex

2012-07-06 14:56:38

跨平臺工具Motorola SoRhoMobile

2012-06-14 09:37:17

Ansca MobilCorona跨平臺工具

2015-05-04 10:20:25

2016-08-19 08:50:12

SparkWordCountreduceByKey

2019-01-31 08:15:38

物聯(lián)網(wǎng)農(nóng)業(yè)IoT

2020-02-10 15:50:18

Spring循環(huán)依賴Java

2017-09-05 10:20:15

2013-05-23 09:45:10

虛擬化桌面虛擬化
點贊
收藏

51CTO技術(shù)棧公眾號

91在线第一页| 小说区图片区图片区另类灬| 久久精品视频6| 日韩a级大片| 欧美视频自拍偷拍| 国产 欧美 日韩 一区| 欧美拍拍视频| 激情综合色综合久久综合| 欧美另类xxx| 蜜桃传媒一区二区亚洲| 国产精品成人**免费视频| 亚洲国产日韩a在线播放性色| 老司机精品福利在线观看| 中文字幕丰满人伦在线| 国产一区日韩一区| 一区二区三区动漫| 日本xxxx免费| 成人免费在线观看视频| 亚洲高清久久久| 一区二区免费在线视频| 日本xxxxwww| 久久精品免费观看| 欧美一区二区三区四区在线| 欧美色视频一区二区三区在线观看| 粉嫩av一区二区| 欧美日韩另类一区| 国产免费成人在线| 成人影音在线| 亚洲色图丝袜美腿| 日韩片电影在线免费观看| 好吊色在线观看| 国产综合色产在线精品| 国产精品福利网站| 九九热在线视频播放| 中文字幕午夜精品一区二区三区| 一区二区在线免费视频| 2一3sex性hd| 麻豆视频久久| 欧美精品一级二级| 亚洲熟妇av一区二区三区漫画| 成人在线直播| 国产精品全国免费观看高清| 欧美日韩国产三区| 亚洲欧美日韩动漫| 粉嫩高潮美女一区二区三区| 91久久国产精品| 精品国产www| 视频一区中文字幕| 国产suv精品一区二区| 欧美一级视频免费观看| 国产真实久久| 欧美疯狂xxxx大交乱88av| 亚洲天堂一级片| 99精品美女| 中文字幕日韩欧美在线视频| 中文字幕成人动漫| 精品不卡一区| 亚洲视频axxx| www.黄色在线| 精品免费在线| 中文日韩电影网站| 国产破处视频在线观看| 不卡日本视频| 丝袜美腿亚洲一区二区| 亚洲国产精品一区二区久久hs| 红桃成人av在线播放| 亚洲一级黄色片| 一区二区三区久久久久| 成人中文在线| 日韩色av导航| 欧美日韩国产精品综合| 欧美日韩三级电影在线| 国模吧一区二区三区| 日本在线观看中文字幕| 国产婷婷精品| 日本欧美国产在线| 久久久久精彩视频| 国产一区二区视频在线播放| 草莓视频一区| 午夜影院在线视频| 国产日韩欧美一区二区三区乱码 | 涩涩网站在线看| 在线观看欧美| 日韩精品一区二区三区在线播放| 国产精品19p| 欧美亚洲大陆| 自拍偷拍亚洲精品| 2021亚洲天堂| 中文精品在线| 国产精品主播视频| 草草视频在线播放| 26uuu精品一区二区在线观看| 欧美日韩一区综合| 国产精品扒开做爽爽爽的视频| 亚洲精品伦理在线| 欧美亚洲一二三区| 亚洲成人精品综合在线| 亚洲国产成人精品久久| 亚洲国产av一区| 欧美一区视频| 日本高清不卡的在线| 国产精品综合在线| 99国产精品久| 黑人巨大国产9丨视频| 麻豆蜜桃在线观看| 欧美精品久久99久久在免费线| 最新国产精品自拍| 成人午夜av| 久久久噜久噜久久综合| 中文字幕欧美色图| 成人深夜福利app| 性欧美大战久久久久久久免费观看| 日本小视频在线免费观看| 色素色在线综合| 中国特级黄色片| 欧美精美视频| 国语自产精品视频在线看抢先版图片 | 国产精品精品国产| 刘亦菲久久免费一区二区| 日本一区二区免费在线观看视频| 国产黄色激情视频| 精品69视频一区二区三区| 日韩激情第一页| 国产精品白嫩白嫩大学美女| 青椒成人免费视频| 久久日韩精品| h片视频在线观看| 在线综合亚洲欧美在线视频| 亚洲国产无码精品| 亚洲成人直播| 97久久人人超碰caoprom欧美 | 国产精品久线在线观看| 欧洲黄色一级视频| www.神马久久| 久久99久久亚洲国产| 一级黄色大片免费观看| 久久久久久久久一| 欧美在线观看成人| 红杏aⅴ成人免费视频| 欧美裸体男粗大视频在线观看| 国产免费a视频| 26uuu国产在线精品一区二区| 8x8ⅹ国产精品一区二区二区| 9999在线精品视频| www国产亚洲精品久久网站| 日韩黄色一级视频| 久久影院午夜片一区| 欧美日韩黄色一级片| a级日韩大片| 久久久亚洲成人| 国模私拍视频在线| 精品magnet| 中文字幕乱码在线| 99国产精品| 久久福利电影| 大胆人体一区| 亚洲香蕉成视频在线观看| 亚洲av无码精品一区二区| 久久综合九色综合97_久久久| 久久久久久久中文| 一区二区美女| 国产精品黄视频| 超碰97在线免费观看| 欧美日韩精品一区二区| 5566中文字幕| 国产精品一区一区三区| 91传媒免费视频| 久久精品色综合| 欧美一级在线播放| 国产在线观看网站| 欧美日韩亚洲高清一区二区| 少妇高潮惨叫久久久久| 国产一二精品视频| 国产中文字幕乱人伦在线观看| 9999久久久久| 欧美一级片久久久久久久| 人成在线免费视频| 欧美丝袜丝nylons| 欧美成欧美va| av中文字幕亚洲| 久久精品网站视频| 天堂美国久久| 国产精品三区www17con| 日韩大尺度黄色| 神马国产精品影院av| 国产chinasex对白videos麻豆| 亚洲亚洲精品在线观看| 亚洲自拍偷拍图| 国产一区二三区| 日韩人妻精品无码一区二区三区| 教室别恋欧美无删减版| 亚洲自拍av在线| 免费h视频在线观看| 中文字幕在线亚洲| 亚洲伦理在线观看| 欧美综合亚洲图片综合区| 日韩国产第一页| 2021久久国产精品不只是精品| 男女污污的视频| 午夜精品视频| 天堂资源在线亚洲资源| 91亚洲无吗| 国产精品三级久久久久久电影| 欧美videossex另类| 夜夜嗨av色综合久久久综合网| 久久精品国产久精国产| 欧美一区二区视频97| 第一福利在线| 精品福利在线导航| 中文字幕乱码视频| 午夜精品久久久久久久| 免费一级suv好看的国产网站| 风间由美性色一区二区三区| 日韩欧美xxxx| 亚洲黄色三级| 最新不卡av| 精品在线观看入口| 国产私拍一区| 国产精品2区| 国产精品久久久久久久电影 | www国产在线| 在线精品视频一区二区| 男人天堂中文字幕| 日韩理论在线观看| www.99热| 久久久天堂av| 久久久久国产精品区片区无码| 久久精品国产精品亚洲精品| 日本a级片免费观看| 欧美视频一区| 国产精品免费看久久久无码| 精品一区不卡| 欧美二区在线看| 久久综合五月婷婷| 成人免费视频网站| 欧美aaaaaa| 国产日韩在线亚洲字幕中文| 国模套图日韩精品一区二区| 午夜免费在线观看精品视频| 天使と恶魔の榨精在线播放| 久久天堂电影网| 欧美性天天影视| 在线视频欧美日韩| seseavlu视频在线| 国产一区二区三区在线观看视频 | 中文字幕av在线一区二区三区| 中文视频在线观看| 成人动漫一区二区三区| 亚洲熟女一区二区| 99精品热视频| 久久久久国产精品无码免费看| 99久久国产综合色|国产精品| 国产高潮失禁喷水爽到抽搐 | 成人欧美一区二区三区视频xxx| 国产精品一区二区三区www| 成人免费视频97| 精品国产18久久久久久二百| 99www免费人成精品| jizzjizzjizz欧美| 久久久久久久久久久久久久一区| 欧美黄色录像| 色爱区成人综合网| 亚洲大全视频| 国产中文字幕乱人伦在线观看| 9久re热视频在线精品| av动漫免费看| 美国一区二区三区在线播放| 特级黄色片视频| 成人深夜福利app| 毛片网站免费观看| 国产精品久久久一区麻豆最新章节| 国产一区第一页| 亚洲黄色在线视频| 欧美三级午夜理伦| 欧美日免费三级在线| 国产免费黄色片| 亚洲精品ady| 成人在线观看网站| 色综合久久中文字幕综合网小说| av成人 com a| 国产精品入口夜色视频大尺度| 国产精品毛片无码| 国产精品区一区二区三在线播放| 欧美日韩破处| 色99中文字幕| 好看不卡的中文字幕| 精品久久久久久久久久中文字幕| 日韩av成人高清| 欧美午夜精品理论片| 国产成人综合精品三级| 五级黄高潮片90分钟视频| 国产精品私人影院| 日韩女优一区二区| 91高清视频免费看| aaa一区二区三区| 欧美色图免费看| 欧美视频一二区| 亚洲人成电影网| 中文日本在线观看| 久久91超碰青草是什么| 人在线成免费视频| 91欧美视频网站| 伊人成综合网伊人222| 国产精品无码乱伦| 性一交一乱一区二区洋洋av| 久久国产精品国产精品| 懂色av噜噜一区二区三区av| 日本污视频网站| 一区二区三区在线免费播放 | 色偷偷88欧美精品久久久| 在线观看免费观看在线| 日韩色在线观看| 1024免费在线视频| 81精品国产乱码久久久久久| 国产日韩一区二区三免费高清| 狠狠色噜噜狠狠色综合久| 成人毛片在线| 37pao成人国产永久免费视频| 国产一区二区三区四| 熟女丰满老熟女熟妇| 亚洲一区二区三区四区中文字幕| jizz国产在线观看| 欧美另类一区二区三区| 天天摸天天干天天操| www.亚洲一区| 性欧美18一19sex性欧美| 精品国产一区二区三区麻豆小说| 久久中文字幕av| 亚洲熟妇国产熟妇肥婆| 国产一区二区不卡老阿姨| 亚洲ⅴ国产v天堂a无码二区| 日韩欧美国产骚| 丰满肥臀噗嗤啊x99av| 久久精品99无色码中文字幕| 成人1区2区| 日韩av在线电影观看| 日韩中文字幕亚洲一区二区va在线| 无码国产精品一区二区高潮| 国产欧美一区二区在线| 无码人妻av一区二区三区波多野| 精品国产乱码91久久久久久网站| 在线免费看黄| 国产欧美日韩免费| 国产调教一区二区三区| 黄色a级片免费| 99在线视频精品| 久艹视频在线观看| 精品处破学生在线二十三| 亚洲小说区图片区都市| 91亚洲国产成人久久精品网站 | 亚洲AV无码成人精品一区| 免费在线观看成人| 日本一级免费视频| 色综合久久九月婷婷色综合| 精品无人乱码| 欧美做受高潮电影o| 精品国产乱码久久久久久果冻传媒| 可以在线看的av网站| eeuss国产一区二区三区| www.国产色| 国产偷亚洲偷欧美偷精品| 成年女人在线看片| 精品国产一区二区三区日日嗨| 激情欧美日韩| 亚洲天堂网一区二区| 欧美视频中文在线看| 色视频在线观看| 欧美一区二区影院| 国产成人ay| 亚洲小视频网站| 亚洲欧洲精品一区二区三区不卡 | 国产一区二区在线视频| 国产女人18水真多毛片18精品| 制服丝袜中文字幕亚洲| 1区2区3区在线| 欧美成ee人免费视频| 免费人成黄页网站在线一区二区 | 亚洲男同1069视频| а√天堂资源在线| 97精品久久久中文字幕免费| 精品国产91| 伊人免费视频二| 亚洲一级在线观看| 岛国最新视频免费在线观看| 国产精品视频资源| 激情六月综合| 欧美 日韩 国产 成人 在线观看 | 一本久久综合亚洲鲁鲁| 成人全视频免费观看在线看| 99re99热| 久久久久久久综合狠狠综合| 伊人22222| 2018日韩中文字幕| 精品国产一区二区三区av片| 免费看涩涩视频| 亚洲综合999| 国产大片在线免费观看| 丁香婷婷久久久综合精品国产 | 国产精品入口久久| 五月天婷婷亚洲|