GNU C 與 ANSI C的區別

2021-09-23 23:09:00 字數 2350 閱讀 9702

1.零長度陣列

gnu c允許使用零長度陣列,定義變長度物件時比較方便

struct var_data ;

var_data的大小僅為乙個int型,data是常量位址,data[index]是訪問其後的記憶體空間。

struct var_data *s = malloc(sizeof(var_data) + len);

釋放記憶體的時候free(s)只釋放int,所以還要認為地釋放data空間,這會帶來不便。另外只有gnu c支援,c/c++編譯永遠通不過。

2.case範圍

gnu c支援case x...y這樣的語法,區間[x ,y]都滿足這個條件。例如

case 0...5 ==> case 0 : case 1: case 2: case 3: case 4: case 5: 

3.語句表示式

gnu c可以把括號中的復合語句看成是語句表示式, a=( ; ; ),於是就有了以下應用

#define min_t(type, x, y) ((type __x  = (x); typ __y = (y); __x < __y ? __x : __y;)) 

float minf  = min_t(float, f1, f2);

int mini  = min_t(int, i1, i2);

4.typeof關鍵字

typeof(x)語句可以獲得x的型別

5.可變引數的巨集

標準c只支援可變引數的函式

int printf(const char *format [, argument]...);

而gnu c也支援可變引數的巨集

#define pr_debug(fmt, arg...)   printfk(fmt, ##arg)

6.標號元素

標準c要求陣列或結構體的初始值必須以固定順序出現,而gnu c可以通過指定索引和結構體成員允許初始化值以任意順序出現([index] = ),當然也可以如下運用

unsigned char data[max] = ;

下面是借助結構體成員名初始化值

struct file_operations ext2_file_operation = ;

但是linux2.6推薦類似的**應該盡量採用標準c的語法

struct file_operations ext2_file_operation = ;

7.當前函式名

gnu c預定義了兩個識別符號儲存當前函式的名字,__function__儲存函式在原始碼中的名字,__pretty_function__儲存帶語言特色的名字,而標註c兩者是一樣的。

void exampe()

8.特殊屬性宣告

gnu c允許宣告函式,變數和型別的特殊屬性,以便進行手工優化和定製**檢查的方法。指定乙個屬性只需在其宣告後新增__attribute__((attribute)).

noreturn 屬性作用於函式,表示該函式從不反悔。這回讓編譯器優化**,並消除不必要的警告資訊。

例如:void do_exit(int n) __attribute__((noreturn));

format屬性也用於函式,該函式使用printf、scanf或strftime風格的引數,指定format屬性可以讓編譯器根據格式串檢查引數型別。

unused屬性作用於函式和變數,表示該函式或變數可能不會被用到,這個屬性可以避免編譯器產生警告資訊。

aligned屬性用於變數、結構體或聯合體,指定變數、結構體或聯合體的對齊方式,以位元組為單位。

例如:struct example_struct __attribute__((aligned(4)));表示該結構型別的變數以4位元組對齊。

packed屬性作用於變數和型別,用於變數和結構體成員時表示使用最小可能的對齊,用於列舉、結構體或聯合體型別時表示該型別使用最小的記憶體。

例如:struct example_struct ;

9.內建函式

gnu c除了標準c提供的內建函式(memcpy)外,還提供了許多其他的內建函式,通常命名以__builtin開始。

__builtin_return_address(level)返回當前函式或呼叫這的返回位址,引數level指定呼叫棧的級數,如0表示當前函式的返回位址,1表示當前函式的呼叫者的返回位址。

__builtin_constant_p(exp)用於判斷乙個值是否為編譯時常數,是返回1,否則返回0.例如下面的**檢測第乙個引數是否為常數以確定採用引數版本還是非引數版本

#define test_bit(nr, addr) (__builtin_constant_p(nr) ? constant_test_bit((nr), (addr)) : variable_test_bit((nr), (addr))

——記《linux裝置驅動開發詳解》宋寶華

GNU C 與 ANSI C的區別

1.零長度陣列 gnu c允許使用零長度陣列,定義變長度物件時比較方便 struct var data var data的大小僅為乙個int型,data是常量位址,data index 是訪問其後的記憶體空間。struct var data s malloc sizeof var data len ...

K R C與ANSI C的區別

c語言由dennis m.ritchie在1973年設計和實現。從那以後使用者逐漸增加。到1978年ritchie和bell實驗室的另一位程式專家kernighan合寫了著名的 thec programming language 將c語言推向全世界,許多國家都出了譯本,國內有一些c語言書就是這本書的...

C K R C 與 ANSI C的區別

c語言由dennis m.ritchie在1973年設計和實現。從那以後使用者逐漸增加。到1978年ritchie和bell實驗室的另一位程式專家kernighan合寫了著名的 the c programming language 將c語言推向全世界,許多國家都出了譯本,國內有一些c語言書就是這本書...