日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux标准c和c编译器6,linux内核中GNU C和标准C的区别

發布時間:2025/4/16 linux 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux标准c和c编译器6,linux内核中GNU C和标准C的区别 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

linux內核中GNU C和標準C的區別

今天看了一下午的linux內核編程方面的內容,發現linux 內核中GNU C與標準C有一些差別,特記錄如下:

linux 系統上可用的C編譯器是GNU C編譯器,它建立在自由軟件基金會的編程許可證的基礎上,因此可以自由發布。GNU C對標準C進行進一步擴展,以增強標準C的功能。下面我們對GNU C中的擴展進行一下總結:

1、零長度數組

GNU C 允許使用零長度數組,在定義變長對象的頭結構時,這個特性非常有用。例如:

struct minix_dir_entry {

__u16 inode;

char name[0];

};

結構的最后一個元素定義為零長度數組,它不占結構的空間。在標準 C 中則需要定義數組長度為 1,分配時計算對象大小比較復雜。

2、case范圍

GNU C 允許在一個 case 標號中指定一個連續范圍的值,例如:

case '0' ... '9': c -= '0'; break;

case 'a' ... 'f': c -= 'a'-10; break;

case 'A' ... 'F': c -= 'A'-10; break;

其中case '0' ... '9': 相當于 case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9':

3、語句表達式

GNU C 把包含在括號中的復合語句看做是一個表達式,稱為語句表達式,它可以出現在任何允許表達式的地方,你可以在語句表達式中使用循環、局部變量等,原本只能在復合語句中使用。例如:

#define min_t(type,x,y) \

({ type __x = (x); type __y = (y); __x < __y ? __x: __y; })

復合語句的最后一個語句應該是一個表達式,它的值將成為這個語句表達式的值。這里定義了一個安全的求最小值的宏,在標準 C 中,通常定義為:

#define min(x,y) ((x) < (y) ? (x) : (y))

這個定義計算 x 和 y 分別兩次,當參數有副作用時(比如出現參數自增或自減語句時),將產生不正確的結果,使用語句表達式只計算參數一次,避免了可能的錯誤。語句表達式通常用于宏定義。

4、typeof關鍵字

使用前一節定義的宏需要知道參數的類型,利用 typeof 可以定義更通用的宏,不

必事先知道參數的類型,例如:

#define min(x,y) ({ \

const typeof(x) _x = (x); \

const typeof(y) _y = (y); \

(void) (&_x == &_y); \

_x < _y ? _x : _y; })

這里 typeof(x)表示 x 的值類型, const typeof(x) _x = (x); 中定義了一個與 x 類型相同的局部變量 _x并初使化為 x, (void) (&_x == &_y); 的作用是檢查參數 x 和 y 的類型是否相同。typeof 可以用在任何類型可以使用的地方,通常用于宏定義。

5、可變參數的宏

在 GNU C 中,宏可以接受可變數目的參數,就象函數一樣,例如:

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

printk(fmt,##arg)

這里 arg 表示其余的參數,可以是零個或多個,這些參數以及參數之間的逗號構成 arg 的值,在宏擴展時替換 arg,例如:

pr_debug("%s:%d",filename,line)

會被擴展為

printk("%s:%d", filename, line)

使用 ## 的原因是處理 arg 不匹配任何參數的情況,這時 arg 的值為空,GNU C 預處理器在這種特殊情況下,丟棄 ## 之前的逗號,這樣

pr_debug("success!\n")

會被擴展為

printk("success!\n")

而不是printk("success!\n",)

注意最后的逗號。

6、標號元素

標準 C 要求數組或結構變量的初使化值必須以固定的順序出現,在 GNU C 中,通過指定索引或結構域名,允許初始化值以任意順序出現。指定數組索引的方法是在初始化值前寫 '[INDEX] =',要指定一個范圍使用 '[FIRST ... LAST] ='` 的形式,例如:

static unsigned long irq_affinity [NR_IRQS] = { [0 ... NR_IRQS-1] = ~0UL };

將數組的所有元素初使化為 ~0UL,這可以看做是一種簡寫形式。

要指定結構元素,在元素值前寫 'FIELDNAME:',例如:

struct file_operations ext2_file_operations = {

llseek: generic_file_llseek,

read: generic_file_read,

write: generic_file_write,

ioctl: ext2_ioctl,

mmap: generic_file_mmap,

open: generic_file_open,

release: ext2_release_file,

fsync: ext2_sync_file,

};

將結構ext2_file_operations的元素 llseek 初始化為 generic_file_llseek,元素 read 初始化為 genenric_file_read,依次類推。我覺得這是 GNU C 擴展中最好的特性之一,當結構的定義變化以至元素的偏移改變時,這種初始化方法仍然保證已知元素的正確性。對于未出現在初始化中的元素,其初值為 0。

7、當前函數名

GNU CC 預定義了兩個標志符保存當前函數的名字,__FUNCTION__保存函數在源碼中的名字,__PRETTY_FUNCTION__保存帶語言特色的名字。在 C 函數中,這兩個名字是相同的,在 C++ 函數中,__PRETTY_FUNCTION__包括函數返回類型等額外信息,Linux 內核只使用了

__FUNCTION__。

void example()

{

printf{“This is function:%s”, __FUNCTION__};

}

代碼中__FUNCTION__意味著字符串“example”。

8、特殊屬性聲明

GNU C 允許聲明函數、變量和類型的特殊屬性,以便手工的代碼優化和更仔細的代碼檢查。要指定一個聲明的屬性,在聲明后寫 attribute (( ATTRIBUTE ))其中 ATTRIBUTE 是屬性說明,多個屬性以逗號分隔。GNU C 支持十幾個屬性,這里介紹最常用的:

* noreturn

屬性 noreturn 用于函數,表示該函數從不返回。這可以讓編譯器生成稍微優化的代碼,最重要的是可以消除不必要的警告信息比如未初使化的變量。例如:

# define ATTRIB_NORET __attribute__((noreturn))....

asmlinkage NORET_TYPE void do_exit(long error_code) ATTRIB_NORET;

* format

屬性 format 用于函數,表示該函數使用 printf, scanf 或 strftime 風格的參數,使用這類函數最容易犯的錯誤是格式串與參數不匹配,指定 format 屬性可以讓編譯器根據格式串檢查參數類型。例如:

asmlinkage int printk(const char * fmt, ...) __attribute__ ((format (printf, 1, 2)));

表示第一個參數是格式串,從第二個參數起根據格式串檢查參數。

* unused

屬性 unused 用于函數和變量,表示該函數或變量可能不使用,這個屬性可以避免編譯器產生警告信息。

* aligned

屬性 aligned 用于變量、結構或聯合類型,指定變量、結構域、結構或聯合的對齊量,以字節為單位,例如:

struct example_struct

{

char a;

int b;

long c;

} __attribute__((aligned(4)));

表示該結構類型的變量以4字節對界。

packed

屬性 packed 用于變量和類型,用于變量或結構域時表示使用最小可能的對齊,用

于枚舉、結構或聯合類型時表示該類型使用最小的內存。例如:

struct example_struct

{

char a;

int b__attribute__ ((packed));

long c__attribute__((packed));

};

對于結構體example_struct而言,在i386平臺下,其sizeof的結果為9,如果刪除其中的2個—attribute__((packed)),其sizeof將為12.

9、內建函數

GNU C 提供了大量的內建函數,其中很多是標準 C 庫函數的內建版本,例如memcpy,它們與對應的 C 庫函數功能相同,不屬于庫函數的其他內建函數的名字通常以 __builtin開始。例如:

__builtin_return_address (LEVEL)

內建函數 __builtin_return_address 返回當前函數或其調用者的返回地址,參數 LEVEL 指定在棧上搜索框架的個數,0 表示當前函數的返回地址,1 表示當前函數的調用者的返回地址,依此類推。

__builtin_constant_p(EXP)

內建函數 __builtin_constant_p 用于判斷一個值是否為編譯時常數,如果參數EXP 的值是常數,函數返回 1,否則返回 0。

__builtin_expect(EXP, C)

內建函數 __builtin_expect 用于為編譯器提供分支預測信息,其返回值是整數表

達式 EXP 的值,C 的值必須是編譯時常數。

例如,下面的代碼檢測第一個參數是否為編譯時常數以確定采用參數版本還是非參數版本代碼:

#define test_bit(nr,addr) \

(__builtin_constant_p(nr) ? \

constant_test_bit((nr),(addr)) : \

variable_test_bit((nr),(addr)))

標簽:__,case,函數,GNU,參數,內核,file,linux

來源: https://www.cnblogs.com/muahao/p/10344382.html

總結

以上是生活随笔為你收集整理的linux标准c和c编译器6,linux内核中GNU C和标准C的区别的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 欧美国产日韩在线 | 国产午夜精品在线 | 亚洲美女www午夜 | 日本两性视频 | 日韩激情网站 | 成人午夜视频精品一区 | 免费在线色| 人人做人人爱人人爽 | 丰满少妇中文字幕 | 91极品在线 | 第一福利丝瓜av导航 | 日韩在线观看视频一区二区三区 | 女同毛片一区二区三区 | 黄色靠逼视频 | 大肉大捧一进一出好爽mba | 免费黄色激情视频 | 亚洲成人h| 成人欧美一区二区三区黑人孕妇 | 日韩精品在线观看免费 | 免费在线观看不卡av | 亚洲婷婷小说 | 一级黄色大片在线观看 | 成人在线免费视频播放 | 欧美亚洲色图视频 | 国产精品久久久久久久久动漫 | 99成人免费视频 | 日本免费a视频 | 99热这里只有精品5 国产精品伦子伦免费视频 精品一二三 | 一区二区不卡 | 依人久久 | 亚洲一级免费视频 | 射久久 | 亚洲v欧美v另类v综合v日韩v | 亚洲一区 在线播放 | 泰坦尼克号3小时49分的观看方法 | 久久黄色小说 | 艳妇臀荡乳欲伦交换在线播放 | 国产91免费看 | 美女国产毛片a区内射 | 亚洲精品一区二区三区不卡 | www在线观看视频 | 国产美女操| 福利视频一区二区三区 | 欧美整片在线 | 麻豆av剧情| 不卡在线一区二区 | 婷婷激情六月 | 91av在线免费观看 | 无码精品人妻一二三区红粉影视 | 播放男人添女人下边视频 | www亚洲视频 | 欧美区一区二区三 | 日韩在线一级 | 国产精品国产成人国产三级 | 日本美女影院 | 日韩草逼 | 一起草av在线 | 99国内揄拍国内精品人妻免费 | 98精品视频 | 欧美午夜精品理论片a级按摩 | 国产成人99久久亚洲综合精品 | 欧美成人精品激情在线观看 | 丁香婷婷网 | 伊人成人22 | 天天艹日日艹 | 欧美一区二区三区视频 | 国产一级av毛片 | 无码人妻精品一区二区三应用大全 | 高潮在线视频 | 99久久99久久久精品棕色圆 | 91视频成人| 人人色视频 | 污的视频在线观看 | 九九免费在线视频 | 爱臀av| 无码人妻精品一区二区三区99不卡 | 久久视频一区二区 | 丰满孕妇性春猛交xx大陆 | 女人扒开屁股让男人捅 | 青青伊人久久 | 中文字幕精品在线 | 男生草女生的视频 | 亚洲天堂自拍 | 亚洲精品日韩综合观看成人91 | av免费播放 | 大地资源二中文在线影视免费观看 | 久久久久久视 | 国产精品成人99一区无码 | 久久久久婷婷 | 欧美v日本 | 涩av | 岛国精品一区二区三区 | 精品国产欧美 | 国产在线精品成人欧美 | 国产在线观看你懂的 | 国产福利专区 | 国产精品一区二区人人爽 | 欧美日韩视频无码一区二区三 | 日韩精品2 |