欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺談Windows系統(tǒng)下C語言編程中Glib庫的使用

 更新時間:2016年02月15日 17:32:50   投稿:goldensun  
這篇文章主要介紹了Windows系統(tǒng)下C語言編程中Glib庫的使用,Glib庫在多線程編程中經(jīng)??梢杂玫?需要的朋友可以參考下

在這個C的變成世界里,有許多實用的庫,其中最有名的且最通用(跨多個平臺的實現(xiàn)包括Windows,要知道很多實用的編程庫都不提供Windows的實現(xiàn))就是GLib這個庫,其中就有實現(xiàn)線程的部分。

glib庫是Linux平臺下最常用的C語言函數(shù)庫,它具有很好的可移植性和實用性。
glib是Gtk +庫和Gnome的基礎(chǔ)。glib可以在多個平臺下使用,比如Linux、Unix、Windows等。glib為許多標(biāo)準(zhǔn)的、常用的C語言結(jié)構(gòu)提供了相應(yīng)的替代物。
如果在程序中要使用到glib庫中的函數(shù),則應(yīng)該包含glib.h頭文件(在gtk.h和gnome.h頭文件中已經(jīng)包含了glib.h了。

但是,因為這是中文的,看的人自然不是歪果仁,中國編程新手大都還是習(xí)慣用 Windows 環(huán)境,也不做強求,仁者見仁智者見智,后續(xù)會有一個程序作為例子,其中簡單的應(yīng)用了多線程的知識來寫一個備份軟件,線程的實現(xiàn)是用的 Windows 自己的接口,所有這些接口都能在 MSDN 里查找到相應(yīng)文檔。

Glib庫在Windows下的配置

之所以不說 *nix 系統(tǒng)下的配置是因為,哪里的配置太無腦了,特別是Ubuntu,一句命令+有網(wǎng)絡(luò)基本就配置完畢了。
使用的是穩(wěn)定版的2.28.8版本,截至目前可用的最高穩(wěn)定版本為2.46.x版本
將預(yù)處理配置好一些步驟的glib打包放在我的網(wǎng)盤中,可以直接下載,添加IDE的路徑就能使用,這是對于 Visual C++ 系列編譯器能用,如果用 MinGW 系列的編譯器就需要重新編譯
如果想自己配置,也可以前往這個網(wǎng)址進行下載,或者前往GNU項目主頁下載最新的源碼以及工程文件自我編譯,方式有很多,不使用現(xiàn)有二進制而自行選擇編譯的大概莫過于想使用MinGW,在MinGW項目的主頁也有介紹
如果資源太少,可以參考如何編譯GTK項目的方法,因為GLib的前身便是GTK的一部分,只不過后來獨立出來了。

微軟的宇宙級編譯器Visual Studio對于C89(C90)之后的標(biāo)準(zhǔn)并不支持,但是對其中的特性卻早早進行了實現(xiàn)(即沒有可開啟標(biāo)準(zhǔn)的選項,但是新標(biāo)準(zhǔn)所說的特性它都擁有,都能夠使用,甚至還要更加超前)

故接下來的備份程序?qū)⑹褂肰isual Studio 2013 進行編寫。
配置glib-2.28.8
下載編譯好的二進制包,預(yù)處理好(某些操作,不多說,網(wǎng)上有教程,記得用谷歌,或者到博客園里找類似的,但是版本比較老可能和我用的有一些出路,但可以依著葫蘆畫瓢)以后,將路徑配置到工程里:
創(chuàng)建一個Win32程序,并且在屬性管理器(左側(cè)欄下部尋找)中創(chuàng)建屬性表(Debug和Release各創(chuàng)建一個,設(shè)置都相同即可)
打開新建的屬性表
通用屬性->VC++目錄->包含目錄->編輯 添加下載下來的文件中的glib\glib2.28\include目錄,不放心的還可以再添加一個glib\glib2.28\lib\glib-2.0\include目錄
通用屬性->VC++目錄->庫目錄->編輯 添加glib\glib2.28\lib目錄
通用屬性->鏈接器->輸入->附加依賴項 添加glib\glib2.28\lib目錄下的所有.lib文件,即將這些文件的名字都手動輸入進去,如果使用我的這個版本的話那就是
gio-2.0.lib glib-2.0.lib gthread-2.0.lib gmodule-2.0.lib gobject-2.0.lib
通用屬性->C/C++->代碼生成->運行庫開啟多線程/MT
Okay!成了
休息一下

其實對于C程序員而言,最重要的莫過于使用一系列開源庫,而不是對新標(biāo)準(zhǔn)的追求,因為越低的標(biāo)準(zhǔn)越容易跨平臺,對于庫而言這是先輩總結(jié)的一系列實用的數(shù)據(jù)結(jié)構(gòu)和算法,甚至是實用的框架。我們不一定需要配置他們,而是從里面吸取一些他們的技術(shù),轉(zhuǎn)為自己的代碼,畢竟庫對于很多程序員編寫的程序來說都大材小用了,但有時候又不得不使用一些必要的數(shù)據(jù)結(jié)構(gòu)和算法。
在大學(xué)的這幾年里,也許是因為不過是一個吊車尾的一本,所以我無法感受到老師教授帶來的教導(dǎo),但是也使得我深深的接觸到了開源,開源給予了我很多,比如更開闊的編程思路,更廣闊的心胸,更有進步的動力,更多的小伙伴。當(dāng)然也知道自己的渺小。
是很多人(比如知乎的回答人和提問者),都提到要多觀看C的源代碼, 但是這對于初學(xué)者,甚至現(xiàn)在的我感覺也不是一件容易的事,更遑論初入門的同學(xué)了,特別是對于許多上個世紀(jì)的大神,為了節(jié)省空間以及提高效率,簡直是無所不用其極!雖然某些用法能夠被現(xiàn)代接受,但是你能在第一眼就看出來,為了構(gòu)造一個紅黑樹節(jié)點,把樹的指針和節(jié)點的顏色信息都隱藏在一個指針地址里嗎?

 /* 假設(shè)有一個節(jié)點的指針 p_node */
 node_color = p_node->node_color & 1; /* 原理就是用最后一位bit來存儲顏色 */

其中在 Linux 里, p_node->node_color 被設(shè)定為無符號的長整形,以整數(shù)型式存儲指針和顏色信息,而不是用指針類型。

  node_pointer = (node_type*)p_node->node_color & ~3;/* 清除最后兩位上的bit的值 */
也就是清除顏色信息,留下的就是指針的值,即地址。

為什么呢,只要我么能夠保證節(jié)點的創(chuàng)建位置是32位/64位對齊的,我們就能夠保證它的最后兩位/三位是空的,絕對不會被使用的。

 /* 32位 */
 sizeof(void*); /* 是 4 */
 /* xxxx xxxx xxxx xxxx xxxx xxxx xxxx xx00 */
 /* 64位 */
 sizeof(void*); /* 是 8 */
 /* 前方省略48位 xxxx xxxx xxxx x000 */

意思就是,對于指針而言,因為編譯器要保證尋址的高效所以它在給分配地址的時候,會對齊內(nèi)存中的地址,按照指針大小的倍數(shù)對齊,這就會導(dǎo)致不同位的程序的指針變量的值中有幾個bit 會沒有使用,則用它來存儲。

具體的情況,網(wǎng)路上的詳細解說十分之多,開一個頭就好。但是這真的是我們一開始就應(yīng)該接觸的嗎?

怎么說,在很多的時候,C語言給我們的函數(shù)都不夠安全可靠,但是在我們無法使用新標(biāo)準(zhǔn)提供的函數(shù)的情況下(十分常見)我們該如何做呢?當(dāng)然是自己寫,怎么寫更完美,自然是看看別人怎么寫,而不是自己一抹黑的亂來,因為事實證明,自認(rèn)為好的到最后都會摔一跤,雖然不是壞事。
最簡單的做法便是用宏包裹一下,做一些預(yù)處理,或者對于宏機制不太喜歡的人會選擇用一個函數(shù)進行包裹,也未嘗不可。

寫在最末尾,填幾個前面挖的坑。
不知道是不是故意的,一般GNU項目的子主頁面上,找不到(很難找到)對應(yīng)的項目的下載地址,也就是光看著介紹如何如何牛,如何如何好用,但就是不告訴你去哪里下,這時候,首先確認(rèn)你要下的這個軟件的名字,然后去GNU項目首頁里的程序列表里找,在哪里一定能找到,而不是在那些介紹頁面亂點,結(jié)果根本找不到。
最典型的就是一個叫做GMP的開源軟件,用來自行編譯MinGW用的依賴,希望能警醒各位。
之所以用2.28.8而不是2.46.x是因為我實在不想自己在Windows上編譯了,因為大部分時候,寫程序都是在 Linux 上,所以就偷懶一下。
對于我的文件是不是有毒,我說有毒,有一種叫做叫你再用Windows編程的毒。
好吧其實我承認(rèn)Visual Studio的確是宇宙無敵的編譯器。
末尾

接下來的第三部分我會用一個備份程序來貫穿

操作系統(tǒng) : Windows
跨平臺 : 否
API調(diào)用 : Win32 API
編譯器 : Visual Studio 2013
語言 : Pure C Programing Language
會在里面介紹一下,常在開源代碼中看見的一些奇怪的東西,例如

 #ifdef __cplusplus
 extern "c" {
 #endif
 ...
 #ifdef __cplusplus
 }
 #endif

相關(guān)文章

  • 淺析C語言中對于char*和char[]的理解

    淺析C語言中對于char*和char[]的理解

    char * s 只是一個保存字符串首地址的指針變量,char a[]是許多連續(xù)的內(nèi)存單元,單元中的元素是char型,char * 和 char a[]具有相同的效果,源于字符串的本質(zhì),這篇文章主要介紹了C語言中對于char*和char[]的理解,需要的朋友可以參考下
    2023-02-02
  • C++設(shè)計模式編程中Facade外觀模式的使用實例解析

    C++設(shè)計模式編程中Facade外觀模式的使用實例解析

    這篇文章主要介紹了C++設(shè)計模式編程中Facade外觀模式的使用實例解析,外觀模式的主要用途就是為子系統(tǒng)的復(fù)雜處理過程提供方便的調(diào)用方法,需要的朋友可以參考下
    2016-03-03
  • 淺談C++中const與constexpr的區(qū)別

    淺談C++中const與constexpr的區(qū)別

    C++11中新增加了用于指示常量表達式的constexpr關(guān)鍵字。本文將帶大家詳細了解一下const與constexpr之間的區(qū)別,需要的小伙伴們可以參考一下
    2021-11-11
  • opencv實現(xiàn)機器視覺檢測和計數(shù)的方法

    opencv實現(xiàn)機器視覺檢測和計數(shù)的方法

    在機器視覺中,有時需要對產(chǎn)品進行檢測和計數(shù)。其難點無非是對于產(chǎn)品的圖像分割。本文就來介紹一下機器視覺檢測和計數(shù)的實現(xiàn),感興趣的可以參考一下
    2021-05-05
  • C語言實現(xiàn)隨機抽取紙牌

    C語言實現(xiàn)隨機抽取紙牌

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)隨機抽取紙牌,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • ?C++模板template原理解析

    ?C++模板template原理解析

    這篇文章主要介紹了C++模板template原理,函數(shù)模板代表了一個函數(shù)家族,該函數(shù)模板與類型無關(guān),在使用時被參數(shù)化,根據(jù)實參類型產(chǎn)生函數(shù)的特定類型版本
    2022-07-07
  • C++菱形繼承及解決方法詳解

    C++菱形繼承及解決方法詳解

    這篇文章主要介紹了C++菱形繼承及解決方法詳解,在多繼承結(jié)構(gòu)中,存在著很多問題,比如從不同基類中繼承了同名成員,派生類中也定義了同名成員,這種二義性問題很好解決,加上要訪問的基類的類名限制就可以了,需要的朋友可以參考下
    2023-08-08
  • C語言實現(xiàn)貪吃蛇小游戲

    C語言實現(xiàn)貪吃蛇小游戲

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)貪吃蛇小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • C++string容器基本概念詳解

    C++string容器基本概念詳解

    c++相比c的一個好處就是實現(xiàn)了很多的容器和泛型算法,使得程序員的工作得到了很大的簡化,本文重點給大家介紹C++string容器基本概念講解,需要的朋友參考下吧
    2021-07-07
  • C++中的編譯與鏈接

    C++中的編譯與鏈接

    這篇文章主要介紹了C++中的編譯與鏈接,編譯型語言SHI?c++最大的優(yōu)點,相比于Python這種解釋型語言,C++在編譯階段就進行了許多處理,在執(zhí)行階段便具有高效性,下面我們就來詳細講解該內(nèi)容吧
    2021-12-12

最新評論