C與跨平臺(tái)開(kāi)發(fā)

      網(wǎng)友投稿 946 2025-04-04

      在眾多高級(jí)編程語(yǔ)言中,C語(yǔ)言歷史悠久,且生命力旺盛,系統(tǒng)開(kāi)發(fā)和應(yīng)用開(kāi)發(fā)兼具,是信息技術(shù)發(fā)展的一把利器。這里簡(jiǎn)單介紹一下C語(yǔ)言的發(fā)展及其對(duì)跨平臺(tái)開(kāi)發(fā)的影響。


      C語(yǔ)言

      C語(yǔ)言是在1969到1973年間,由貝爾實(shí)驗(yàn)室的 Dennis Ritchie 最初為重寫(xiě)unix操作系統(tǒng)而開(kāi)發(fā)的,它成功替代了匯編語(yǔ)言開(kāi)發(fā)操作系統(tǒng)的模式,隨后得到了廣泛飛速的發(fā)展。由于幾大流行操作系統(tǒng)的內(nèi)核(Linux、Windows等)都是由C開(kāi)發(fā)的,所以稱之為系統(tǒng)編程語(yǔ)言,其能力不局限于系統(tǒng)開(kāi)發(fā)。常見(jiàn)的高級(jí)編程語(yǔ)言或腳本語(yǔ)言,像Java、Python、Perl和PHP等都是應(yīng)用類(lèi)編程語(yǔ)言,對(duì)開(kāi)發(fā)人員來(lái)說(shuō),由這些語(yǔ)言編寫(xiě)的代碼,不存在運(yùn)行平臺(tái)的問(wèn)題,很多高級(jí)語(yǔ)言也是由C來(lái)編寫(xiě)的。

      而與眾多流行的高級(jí)編程語(yǔ)言相比,C語(yǔ)言是一種與平臺(tái)真正相關(guān)的編程語(yǔ)言(C++可以認(rèn)為是C的超集)。編譯工具將C源代碼翻譯成某種機(jī)器指令集的二進(jìn)制程序,這種程序只能在相應(yīng)的操作系統(tǒng)和硬件平臺(tái)上運(yùn)行。Java程序則僅需一次編譯,就可到處運(yùn)行,與具體的硬件平臺(tái)無(wú)關(guān),唯一條件就是該平臺(tái)上得有java虛擬機(jī)。

      跨平臺(tái)開(kāi)發(fā)

      跨平臺(tái)開(kāi)發(fā),是指一套代碼(或者一種業(yè)務(wù))在多個(gè)平臺(tái)上運(yùn)行的編程方式,也是一種開(kāi)發(fā)技巧。平臺(tái)就是業(yè)務(wù)運(yùn)行的環(huán)境,Windows、Linux和Unix等就是最典型的計(jì)算機(jī)操作系統(tǒng)平臺(tái),還有像瀏覽器IE、Chrome和Firefox等是一類(lèi)應(yīng)用平臺(tái);這些“平臺(tái)”也有自己的運(yùn)行“平臺(tái)”,Windows可以運(yùn)行在x86、amd64和arm等硬件平臺(tái)上,Linux可以跑的更多;這里討論的平臺(tái)指操作系統(tǒng),涉及的平臺(tái)分Windows和Unix-like。各種Unix和各種Linux視為同宗,Portable Operating System Interface (POSIX)這套規(guī)范在Unix-like上表現(xiàn)的較為一致,Windows上也有支持,但其上的Win32 API功能更為豐富。

      跨平臺(tái)開(kāi)發(fā)當(dāng)然是為了滿足業(yè)務(wù)發(fā)展的需要而進(jìn)行的,當(dāng)你的軟件在Windows上已運(yùn)行良好,但隨Linux市場(chǎng)的興起,你不得不開(kāi)發(fā)Linux上的產(chǎn)品,在Linux平臺(tái)上重造一個(gè)“輪子”,業(yè)務(wù)與Windows上運(yùn)行的軟件沒(méi)有差異,只是換了個(gè)平臺(tái)而已。由于平臺(tái)的差異,操作系統(tǒng)提供的接口不同,開(kāi)發(fā)人員根據(jù)不同的系統(tǒng)調(diào)用實(shí)現(xiàn)相同的業(yè)務(wù)需求。在開(kāi)發(fā)過(guò)程中,自然而然地出現(xiàn)一種抽象層,將業(yè)務(wù)和運(yùn)行平臺(tái)進(jìn)行分離。

      像Java這樣的高級(jí)語(yǔ)言可以算是高級(jí)抽象,使用這些應(yīng)用類(lèi)語(yǔ)言來(lái)編寫(xiě)軟件不用考慮平臺(tái),只需關(guān)注業(yè)務(wù),這是一種比較常用的開(kāi)發(fā)模式。這樣似乎沒(méi)有必要使用C來(lái)做應(yīng)用開(kāi)發(fā),但在實(shí)踐當(dāng)中,許許多多的基礎(chǔ)部件:數(shù)據(jù)庫(kù)MySql、WEB服務(wù)器Apache等都是C來(lái)開(kāi)發(fā)的,因?yàn)镃開(kāi)發(fā)的軟件開(kāi)銷(xiāo)少、運(yùn)行效率高。

      跨平臺(tái)問(wèn)題

      C語(yǔ)言本應(yīng)該是跨平臺(tái)的,幾乎每個(gè)平臺(tái)都原生支持C開(kāi)發(fā)環(huán)境。由于C編譯器實(shí)現(xiàn)的差異性和操作系統(tǒng)的多樣性,導(dǎo)致用C開(kāi)發(fā)應(yīng)用時(shí)存在跨平臺(tái)運(yùn)行問(wèn)題。

      有必要說(shuō)一下C語(yǔ)言的幾個(gè)主要標(biāo)準(zhǔn)的進(jìn)化

      K&R C

      經(jīng)典C,事實(shí)標(biāo)準(zhǔn),許多編譯器的最低標(biāo)準(zhǔn)要求

      C89

      標(biāo)準(zhǔn)C,大部分C代碼都是C89兼容的

      C99

      引入了非常多的新特性,有較多的c編譯器提供支持,gcc就支持的很好,但微軟公司對(duì)這個(gè)標(biāo)準(zhǔn)不那么熱心,其集成開(kāi)發(fā)工具Visual Studio 2013才開(kāi)始比較良好地支持C99特性,這也成了軟件從Linux系統(tǒng)移植到Windows平臺(tái)的一個(gè)障礙。

      新特性有:

      宏定義支持取可變參數(shù) #define Macro(…) _VAARGS

      使用宏定義時(shí),允許省略參數(shù),被省略的參數(shù)會(huì)被擴(kuò)展成空串

      增加了內(nèi)聯(lián)函數(shù)

      支持不定長(zhǎng)的數(shù)組,即數(shù)組長(zhǎng)度可以在運(yùn)行時(shí)決定,比如利用變量作為數(shù)組長(zhǎng)度。聲明時(shí)使用 int a[var] 的形式。

      變量聲明不必放在語(yǔ)句塊的開(kāi)頭,隨用隨定義;for 語(yǔ)句常寫(xiě)成 for(int i=0;i<100;++i) 的形式,即i 只在 for 語(yǔ)句塊內(nèi)部有效;微軟的一些編譯器不支持這樣的書(shū)寫(xiě)方式。

      允許在 struct 的最后定義的數(shù)組不指定其長(zhǎng)度,寫(xiě)做 type name[] 的形式,主要用在不定長(zhǎng)結(jié)構(gòu)體的定義中,這個(gè)特性在應(yīng)用中較為常見(jiàn);

      結(jié)構(gòu)定義

      struct vectord { size_t len; double arr[]; // the flexible array member must be last };

      這樣使用

      //申請(qǐng)內(nèi)存尺寸 sizeof(struct) + array_len*sizeof(array element) struct vectord *vector = sizeof(struct vectord) + array_len*sizeof(double); vector->len = ...; for (int i = 0; i < vector->len; i++) vector[i] = ...

      初始化結(jié)構(gòu)的時(shí)候允許對(duì)特定的元素賦值,形式為:

      (微軟的一些編譯器同樣不支持。)

      struct test{int a[3],b;} foo[] = { [0].a = {1}, [1].a = 2 }; // 3,4 是對(duì) .c,.d 賦值的 struct test{int a, b, c, d;} foo = { .a = 1, .c = 3, 4, .b = 5 };

      其他標(biāo)準(zhǔn)

      C與跨平臺(tái)開(kāi)發(fā)

      C11等,如果是跨平臺(tái)開(kāi)發(fā),似乎可以無(wú)視最近標(biāo)準(zhǔn)引入的新特性了。

      我們?cè)谟肅進(jìn)行開(kāi)發(fā)時(shí),盡量使用C89標(biāo)準(zhǔn)和部分C99特性,在需要依賴操作系統(tǒng)平臺(tái)特性時(shí),通過(guò)宏來(lái)控制相應(yīng)平臺(tái)上的特殊代碼——

      #if defined(_WIN32)

      #define WIN32_LEAN_AND_MEAN

      #include

      #else

      #include

      #if defined(unix)

      #include

      #endif

      #endif

      #if defined(_WIN32)

      #elif defined(_AIX)

      #include

      #include

      #elif defined(linux) …

      #elif defined(__sun) && defined(__SVR4)…

      #endif

      宏定義是C語(yǔ)言的一個(gè)特色,功能很多;可以利用它針對(duì)特定平臺(tái)編譯特定代碼,其他平臺(tái)的代碼不會(huì)編譯連接到執(zhí)行文件中,這樣產(chǎn)生的程序規(guī)模就會(huì)小很多,同時(shí)產(chǎn)生了平臺(tái)依賴。而java程序,如果要執(zhí)行特定平臺(tái)的業(yè)務(wù),需要在運(yùn)行時(shí)來(lái)檢查當(dāng)前運(yùn)行的環(huán)境,再來(lái)做出選擇。

      當(dāng)然,我們是站在巨人肩膀上進(jìn)行軟件開(kāi)發(fā)的,不用親自實(shí)現(xiàn)每項(xiàng)功能,在開(kāi)源世界里有許許多多通用的、成熟的工具庫(kù)可以使用。

      NSPR (NetScape Portable Runtime)

      它為非GUI(圖形界面)開(kāi)發(fā)提供了一套平臺(tái)獨(dú)立的系統(tǒng)工具庫(kù),涉及的內(nèi)容包括:

      NSPR的目標(biāo)是在各個(gè)操作系統(tǒng)環(huán)境提供統(tǒng)一的API,它不是努力輸出各個(gè)操作系統(tǒng)的最廣泛特性,而是提供最優(yōu)解或者說(shuō)是最佳實(shí)踐,這些功能是現(xiàn)代操作系統(tǒng)的共有特性。如果出現(xiàn)新的操作系統(tǒng),將NSPR移植到新平臺(tái)的成功率是非常高的,主流系統(tǒng)NSPR均有支持。瀏覽器Firfox就用到了它。

      該庫(kù)雖歷史悠久,但生命力強(qiáng)盛。接口設(shè)計(jì)的比較穩(wěn)定,具有很好的二進(jìn)制兼容性。

      線程

      線程同步

      文件和網(wǎng)絡(luò)IO

      時(shí)間

      內(nèi)存管理

      共享庫(kù)處理

      APR(Apache Portable Runtime)

      Apache的跨平臺(tái)庫(kù),除了基本的操作系統(tǒng)抽象外,還提供了比較豐富的工具。

      OpenSSL

      網(wǎng)絡(luò)安全通訊庫(kù)

      libcurl

      客戶端網(wǎng)絡(luò)通信開(kāi)發(fā)庫(kù),支持非常多的網(wǎng)絡(luò)協(xié)議,HTTP(S)、FTP(S)、POP3、SCP和SMTP等等。

      很多工具庫(kù)首先以C(或C++)的形式出現(xiàn),然后再為其他高級(jí)語(yǔ)言提供功能擴(kuò)展。

      跨平臺(tái)開(kāi)發(fā),除了語(yǔ)言層面上的,還有編譯工具鏈的問(wèn)題,涉及如何建立工程文件,使用什么編譯器等等。CMake系統(tǒng)可以幫助解決跨平臺(tái)工程文件構(gòu)建問(wèn)題,先為平臺(tái)生成對(duì)應(yīng)開(kāi)發(fā)環(huán)境的工程文件,再由平臺(tái)上的編譯工具進(jìn)行編譯;為可以生成 Visual Studio 工程文件,也可以為Unix-like系統(tǒng)生成Makefile。

      小結(jié)

      C語(yǔ)言既可進(jìn)行操作系統(tǒng)開(kāi)發(fā),也可進(jìn)行應(yīng)用開(kāi)發(fā),適用范圍廣泛,對(duì)C開(kāi)發(fā)人員來(lái)說(shuō),想象力限制了開(kāi)發(fā)能力。但它不是馬斯洛大錘,所要解決的問(wèn)題也不都是釘子。在實(shí)踐中,需要在軟件運(yùn)行速度和開(kāi)發(fā)效率等問(wèn)題上取得平衡。(徐品華 | 天存信息)

      Ref

      C (programming language)

      Flexible array member

      Mozilla-About_NSPR

      CMake

      C 語(yǔ)言 HTTP 開(kāi)發(fā)者 網(wǎng)絡(luò)

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:excel表格內(nèi)畫(huà)兩條斜線的教程(excel表格畫(huà)兩個(gè)斜線)
      下一篇:WPS表格受保護(hù),怎么解?怎么使用替換功能?(wps表格怎么解除保護(hù))
      相關(guān)文章
      亚洲最大的成人网站| 久久久国产亚洲精品| 久久精品国产亚洲AV麻豆~| 亚洲人成人伊人成综合网无码| 久久精品亚洲精品国产色婷| 亚洲丝袜中文字幕| 亚洲国产成人91精品| 亚洲激情视频网站| 亚洲中文字幕久久精品无码喷水| 亚洲免费闲人蜜桃| 亚洲国产综合在线| 亚洲国产成人精品无码区在线网站 | 亚洲一区二区三区免费| 亚洲AV无码一区二区三区国产| 亚洲成AV人片在WWW| 久久精品国产亚洲av天美18| 国产精品国产亚洲区艳妇糸列短篇| 亚洲第一成年免费网站| 亚洲va中文字幕| 午夜亚洲国产精品福利| 亚洲精品无码永久在线观看| 国产日韩成人亚洲丁香婷婷| 在线亚洲午夜理论AV大片| 亚洲精品制服丝袜四区| 爱爱帝国亚洲一区二区三区| 精品国产亚洲AV麻豆| 亚洲色偷拍区另类无码专区| 亚洲无人区一区二区三区| 亚洲av最新在线网址| 亚洲天堂在线播放| 亚洲欧洲日产专区| 狠狠色伊人亚洲综合网站色| 亚洲精品av无码喷奶水糖心| mm1313亚洲国产精品美女| 国产亚洲精品bv在线观看| 亚洲Av永久无码精品黑人| 亚洲精品国产高清不卡在线 | 亚洲特级aaaaaa毛片| 亚洲中文字幕AV在天堂| 亚洲AV成人精品一区二区三区| 怡红院亚洲红怡院在线观看|