GTK 程式設計入門 1 簡介與glib庫

2021-07-04 06:49:59 字數 4348 閱讀 6604

gtk+是乙個軟體開發工具包,其設計目的是支援在 x window系統下開發圖形介面的應用程式。gnu所認定的標準桌面環境gnome就是用gtk+開發的。

gtk+最初是由美國加利福尼亞大學伯克利分校的兩名學生spencer kimball和peter mattis開發而成的。gtk+的全稱為:gimp toolkit。其最初是開發gimp而得名,也是為了開發gimp而研製的一套圖形介面庫。它為應用軟體提供了一套平台無關的,簡單易用的圖形介面介面,幾乎所有的基本圖形介面元素,比如視窗,容器,標籤,按鈕,編輯框,列表框等。

gtk+是建立於gdk基礎上的構件庫。gdk是gtk+的底層圖形庫,gdk封裝了與平台相關的函式和系統呼叫,為gtk+提供了一套與平台無關的開發介面。

gtk+庫和gdk庫均構建於gnu的重要函式庫glib之上。glib庫是linux平台下最常用的c語言庫,它具有很好的可移植性和使用性。glib庫包含了一些標準應用的新擴充套件來提高gtk+的相容性。glib為許多標準的,常用的c語言結構提供了相應的替代物。

在ubuntu linux下安裝gtk+開發包:

sudo apt-get install libgtk-3-dev

glib庫是gtk+和gdk所依賴的基礎函式庫。glib庫的編碼風格是半物件導向的,即以物件導向的思想設計,以面向過程的語言(c語言)實線。glib庫為許多標準的,常用的c語言結構提供了相應的替代物,glib庫的識別符號使用乙個字首「g」這是一種通行的命名約定。

glib有一套自己的型別系統,與c語言標準型別的對比如下。

c型別glib型別

char

gchar

short

gshort

long

glong

intgint

intgboolean

float

gfloat

double

gdouble

unsigned char

guchar

unsigned short

gushort

unsigned long

gulong

unsigned int

guint

void *

gpointer

const void *

gconstpointer

glib還提供了一些巨集的定義。這些巨集可分為兩類,一類是常用巨集,另一類是調式巨集。

- 常用巨集

巨集名說明

true

gboolean型別,邏輯真

false

gboolean型別,邏輯假

null

一般用於表示空指標,值為0

max(a,b)

返回兩者中的較大值

min(a,b)

返回兩者中的較小值

abs(x)

返回絕對值

clamp(x, low, high)

返回[low, high]範圍內的值,x在範圍內返回x,比low小返回low,比high大返回high

gint_to_pointer(p)

整數轉指標

gpointer_to_int(p)

指標轉整數

guint_to_pointer(p)

無符號整數轉指標

gpointer_to_uint(p)

指標轉無符號整數

- 調式巨集

為什麼有調式巨集的存在?

使用調式巨集能夠快速發現程式中的錯誤。而且可以通過定義編譯開關巨集g_disable_checks或g_disable_assert來關閉這些巨集的功能,所以在軟體**中使用它們不會有效能損失。調式巨集還分兩種,分別是前提條件檢查巨集和斷言。

既然有兩種不同的調式巨集,那麼它們有特殊的使用規範嗎?有的。一般使用前提條件檢查來保證傳遞到程式模組的公用介面的值的合法性,用斷言來檢查函式或庫內部的一致性。這便是調式巨集的使用規範。

- (1)前提條件檢查巨集

#include 

g_return_if_fail(condition);

g_return_value_if_fail(condition, retval);

前提條件檢查巨集的作用?在指定的條件不成立時輸出乙個警告資訊,並立即從當前的函式返回。

這兩個巨集的區別?g_return_value_if_fail在條件不成立時將第二個引數作為返回值返回,而g_return_if_fail以void返回。

下面是乙個小例項:

void getpoint(gint index)

int main()

這段下程式是執行通不過的,在我的機器上它的執行結果如下所示:

biantiao@lazybone1994-thinkpad-e430

:~/sh/gtk+

$ ./g_return_if_fail

** (process:

2773):

critical **:

getpoint: assertion 'index >= 0' failed

biantiao@lazybone1994-thinkpad-e430

:~/sh/gtk+$

#include 

g_assert(condition);

g_assert_not_reached();

斷言巨集的作用?在指定條件不成立時輸出乙個警告資訊,並終止程式的執行。

g_assert()基本上和assert()一樣,但是g_assert對g_disable_assert響應。

乙個使用g_assert的簡單例項:

#include 

int main()

說明:這個程式是無法執行的,因為pointer的值不為null。它在我的機器上的執行結果如下:

biantiao@lazybone1994-thinkpad-e430

:~/sh/gtk+

$ ./g_assert

**error

:g_assert.c:

8:main

: assertion failed: (pointer == null)

已放棄biantiao@lazybone1994-thinkpad-e430

:~/sh/gtk+$

程式如果執行到g_assert_not_reached()語句,它會呼叫abort()退出程式並且(如果環境支援)轉儲乙個可用於調式的core檔案。g_assert_not_reached()用於標識「不可能」的情況,通常用於檢測列舉值的switch語句。下面是乙個簡單的例項。

#include 

#include

enum color ;

int main()

return

0;}

同樣,這個程式也是無法正確執行的。原因在於clr的值為4,不在列舉值的範圍(0~2)中,所以程式將執行到default分支,從而呼叫了g_assert_not_reached巨集。它在我的機器上的執行結果如下:

biantiao@lazybone1994-thinkpad-e430

:~/sh/gtk+

$ ./g_assert_not_reached

**error

:g_assert_not_reached.c:

25:main

: code should not be reached

已放棄biantiao@lazybone1994-thinkpad-e430

:~/sh/gtk+$

最後再來說說glib庫的情況。

關於程式的編譯。因為glib庫的標頭檔案和庫檔案均不在標準目錄下,編譯時應當使用反引號將「pkg-config –cflags –libs glib-2.0」命令的執行結果替換到編譯命令列中。如下所示:

biantiao@lazybone1994-thinkpad-e430

:~/sh/gtk+

$ gcc -o g_assert g_assert.c `pkg-config --cflags --libs glib-2.0`

biantiao@lazybone1994-thinkpad-e430

:~/sh/gtk+$

除了上述的型別和巨集之外,glib庫中定義了大量的常用函式。其中,g_printf()函式用於向終端輸出一條訊息,其語法與printf類似。

除了上述內容外,glib庫中還定義了單向鍊錶(gslist),雙向鍊錶(slist),樹(gtree)和雜湊表(ghashtable)等資料結構。

shell程式設計入門簡介

曾經有人說過,學習linux不知道shell程式設計,那就是不懂linux,現在細細品味確實是這樣。shell是作業系統的最外層,shell可以合併程式語言以控制程序和檔案,以及啟動和控制其他程式。shell通過提示您輸入,向作業系統解釋該輸入,然後處理來自作業系統的任何結果輸出,簡單來說shell...

Ragel入門1 簡介

dccmx 於 2011年 一月 3日 發表 最後修改於 2011年 一月 10日 ragel是個好東西啊,很好很強大。它是什麼?它是個 狀態機編譯器 就是說那是用來從某定義編譯出狀態機的工具。其實它是個很好很強大的基於正規表示式和狀態機的超級詞法分析器。我們可以用它來生成強大的詞法分析器,用來分析...

Kafka入門 1 簡介

了解kafka之前我們先來了解一下訊息佇列 訊息佇列,英文名 message queue,經常縮寫為mq。從字面上來理解,訊息佇列是一種用來儲存訊息的佇列。來看一下下面的 1.建立乙個儲存字串的佇列 queuestringqueue new linkedlist 2.往訊息佇列中放入訊息 strin...