欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

嵌入式C語(yǔ)言自我修養(yǎng)02:Linux內(nèi)核驅(qū)動(dòng)中的指定初始-創(chuàng)新互聯(lián)

2.1 什么是指定初始化

在標(biāo)準(zhǔn) C 中,當(dāng)我們定義并初始化一個(gè)數(shù)組時(shí),常用方法如下:

創(chuàng)新互聯(lián)公司從2013年成立,是專(zhuān)業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目成都網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元臨翔做網(wǎng)站,已為上家服務(wù),為臨翔各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話(huà):13518219792
int a[10] = {0,1,2,3,4,5,6,7,8};

按照這種固定的順序,我們可以依次給 a[0] 和 a[8] 賦值。因?yàn)闆](méi)有對(duì) a[9] 賦值,所以編譯器會(huì)將 a[9] 默認(rèn)設(shè)置為0。當(dāng)數(shù)組長(zhǎng)度比較小時(shí),使用這種方式初始化比較方便。當(dāng)數(shù)組比較大,而且數(shù)組里的非零元素并不連續(xù)時(shí),這時(shí)候再按照固定順序初始化就比較麻煩了。

比如,我們定義一個(gè)數(shù)組 b[100],其中 b[10]、b[30] 需要初始化,如果還按照前面的固定順序初始化,{}中的初始化數(shù)據(jù)中間可能要填充大量的0,比較麻煩。

那怎么辦呢?C99 標(biāo)準(zhǔn)改進(jìn)了數(shù)組的初始化方式,支持指定任意元素初始化,不再按照固定的順序初始化。

int b[100] ={ [10] = 1, [30] = 2};

通過(guò)數(shù)組索引,我們可以直接給指定的數(shù)組元素賦值。除此之外,一個(gè)結(jié)構(gòu)體變量的初始化,也可以通過(guò)指定某個(gè)結(jié)構(gòu)體域直接賦值。

因?yàn)?GNU C 支持 C99 標(biāo)準(zhǔn),所以 GCC 編譯器也支持這一特性。甚至早期不支持 C99,只支持 C89 的 GCC 編譯器版本,這一特性也被當(dāng)作一個(gè) GCC 編譯器的擴(kuò)展特性來(lái)提供給程序員使用。

2.2 指定初始化數(shù)組元素

在 GNU C 中,通過(guò)數(shù)組元素索引,我們就可以給某個(gè)指定的元素直接賦值。

int b[100] = { [10] = 1, [30] = 2 };

在{ }中,我們通過(guò) [10] 數(shù)組元素索引,就可以直接給 a[10] 賦值了。這里有個(gè)細(xì)節(jié)注意一下,就是各個(gè)賦值之間用逗號(hào) “,” 隔開(kāi),而不是使用分號(hào)“;”。

如果我們想給數(shù)組中某一個(gè)索引范圍的數(shù)組元素初始化,可以采用下面的方式。

int main(void)
{
    int b[100] = { [10 ... 30] = 1, [50 ... 60] = 2 };
    for(int i = 0; i < 100; i++)
    {
        printf("%d  ", a[i]);
        if( i % 10 == 0)
            printf("\n");
    }
    return 0;   
}

在這個(gè)程序中,我們使用 [10 ... 30] 表示一個(gè)索引范圍,相當(dāng)于給 a[10] 到 a[30] 之間的20個(gè)數(shù)組元素賦值為1。

GNU C 支持使用 ... 表示范圍擴(kuò)展,這個(gè)特性不僅可以使用在數(shù)組初始化中,也可以使用在 switch-case 語(yǔ)句中。比如下面的程序:

#include<stdio.h>
int main(void)
{
    int i = 4;
    switch(i)
    {
        case 1:
            printf("1\n");
            break;
        case 2 ... 8:
            printf("%d\n",i);
            break;
        case 9:
            printf("9\n");
            break;
        default:
            printf("default!\n");
            break;
    }
    return 0;
}

在這個(gè)程序中,當(dāng) case 值為2到8時(shí),都執(zhí)行相同的 case 分支,可以通過(guò) case 2 ... 8: 的形式來(lái)簡(jiǎn)化代碼。這里同樣也有一個(gè)細(xì)節(jié)需要注意,就是 ... 和其兩端的數(shù)據(jù)范圍2和8之間也要空格,不能寫(xiě)成2...8的形式,否則編譯就會(huì)通不過(guò)。

2.3 指定初始化結(jié)構(gòu)體成員變量

跟數(shù)組類(lèi)似,在標(biāo)準(zhǔn) C 中,結(jié)構(gòu)體變量的初始化也要按照固定的順序。在 GNU C 中我們也可以通過(guò)結(jié)構(gòu)域來(lái)初始化指定某個(gè)成員。

struct student{
    char name[20];
    int age;
};

int main(void)
{
    struct student stu1={ "wit",20 };
    printf("%s:%d\n",stu1.name,stu1.age);

    struct student stu2=
    {
        .name = "wanglitao",
        .age  = 28
    };
    printf("%s:%d\n",stu2.name,stu2.age);

    return 0;
}

在程序中,我們定義一個(gè)結(jié)構(gòu)體類(lèi)型 student,然后分別定義兩個(gè)結(jié)構(gòu)體變量 stu1 和 stu2。初始化 stu1 時(shí),我們采用標(biāo)準(zhǔn) C 的初始化方式,即按照固定順序直接初始化。初始化 stu2 時(shí),我們采用 GNU C 的初始化方式,通過(guò)結(jié)構(gòu)域名 .name 和 .age,我們就可以給結(jié)構(gòu)體變量的某一個(gè)指定成員直接賦值。非常方便。

2.4 Linux 內(nèi)核驅(qū)動(dòng)注冊(cè)

在 Linux 內(nèi)核驅(qū)動(dòng)中,大量使用 GNU C 的這種指定初始化方式,通過(guò)結(jié)構(gòu)體成員來(lái)初始化結(jié)構(gòu)體變量。比如在字符驅(qū)動(dòng)程序中,我們經(jīng)常見(jiàn)到這樣的初始化:

static const struct file_operations ab3100_otp_operations = {
.open        = ab3100_otp_open,
.read        = seq_read,
.llseek        = seq_lseek,
.release    = single_release,
};

在驅(qū)動(dòng)程序中,我們經(jīng)常使用 file_operations 這個(gè)結(jié)構(gòu)體變量來(lái)注冊(cè)我們開(kāi)發(fā)的驅(qū)動(dòng),然后以回調(diào)的方式來(lái)執(zhí)行我們驅(qū)動(dòng)實(shí)現(xiàn)的相關(guān)功能。結(jié)構(gòu)體 file_operations 在 Linux 內(nèi)核中的定義如下:

struct file_operations {
        struct module *owner;
        loff_t (*llseek) (struct file *, loff_t, int);
        ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);
        ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);
        ssize_t (*read_iter) (struct kiocb *, struct iov_iter *);
        ssize_t (*write_iter) (struct kiocb *, struct iov_iter *);
        int (*iterate) (struct file *, struct dir_context *);
        unsigned int (*poll) (struct file *, struct poll_table_struct *);
        long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);
        long (*compat_ioctl) (struct file *, unsigned int, unsigned long);
        int (*mmap) (struct file *, struct vm_area_struct *);
        int (*open) (struct inode *, struct file *);
        int (*flush) (struct file *, fl_owner_t id);
        int (*release) (struct inode *, struct file *);
        int (*fsync) (struct file *, loff_t, loff_t, int datasync);
        int (*aio_fsync) (struct kiocb *, int datasync);
        int (*fasync) (int, struct file *, int);
        int (*lock) (struct file *, int, struct file_lock *);
        ssize_t (*sendpage) (struct file *, struct page *, int, size_t, loff_t *, int);
        unsigned long (*get_unmapped_area)(struct file *,
               unsigned long, unsigned long, unsigned long, unsigned long);
        int (*check_flags)(int);
        int (*flock) (struct file *, int, struct file_lock *);
        ssize_t (*splice_write)(struct pipe_inode_info *, 
            struct file *, loff_t *, size_t, unsigned int);
        ssize_t (*splice_read)(struct file *, loff_t *, 
            struct pipe_inode_info *, size_t, unsigned int);
        int (*setlease)(struct file *, long, struct file_lock **, void **);
        long (*fallocate)(struct file *file, int mode, loff_t offset,
                  loff_t len);
        void (*show_fdinfo)(struct seq_file *m, struct file *f);
        #ifndef CONFIG_MMU
        unsigned (*mmap_capabilities)(struct file *);
        #endif
    };

結(jié)構(gòu)體 file_operations 里面定義了很多結(jié)構(gòu)體成員,而在這個(gè)驅(qū)動(dòng)中,我們只初始化了部分成員變量,通過(guò)訪(fǎng)問(wèn)結(jié)構(gòu)體的成員來(lái)指定初始化,非常方便。

2.5 指定初始化的好處

這種指定初始化方式,不僅使用靈活,而且還有一個(gè)好處就是:代碼易于維護(hù)。尤其是在 Linux 內(nèi)核這種大型項(xiàng)目中,幾萬(wàn)個(gè)文件,幾千萬(wàn)的代碼量,當(dāng)成百上千個(gè)文件都使用 file_operations 這個(gè)結(jié)構(gòu)體類(lèi)型來(lái)定義變量并初始化時(shí),那么一個(gè)很大的問(wèn)題就來(lái)了:如果采用標(biāo)準(zhǔn) C 那種按照固定順序賦值,當(dāng)我們的 file_operations 結(jié)構(gòu)體類(lèi)型發(fā)生改變時(shí),如添加成員、減少成員、調(diào)整成員順序,那么使用該結(jié)構(gòu)體類(lèi)型定義變量的大量 C 文件都需要重新調(diào)整初始化順序,牽一發(fā)而動(dòng)全身,想想這是多么可怕!

我們通過(guò)指定初始化方式,就可以避免這個(gè)問(wèn)題。無(wú)論file_operations 結(jié)構(gòu)體類(lèi)型如何變化,添加成員也好、減少成員也好、調(diào)整成員順序也好,都不會(huì)影響其它文件的使用。有了指定初始化,再也不用加班修改代碼了,媽媽再也不用擔(dān)心我們整日加班,不回家吃飯了,多好!

本教程根據(jù) C語(yǔ)言嵌入式Linux高級(jí)編程視頻教程 第05期 改編,電子版書(shū)籍可加入QQ群:475504428 下載,更多嵌入式視頻教程,可關(guān)注:
微信公眾號(hào):宅學(xué)部落(armlinuxfun)
51CTO學(xué)院-王利濤老師:http://edu.51cto.com/sd/d344f

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線(xiàn),公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性?xún)r(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專(zhuān)為企業(yè)上云打造定制,能夠滿(mǎn)足用戶(hù)豐富、多元化的應(yīng)用場(chǎng)景需求。

文章標(biāo)題:嵌入式C語(yǔ)言自我修養(yǎng)02:Linux內(nèi)核驅(qū)動(dòng)中的指定初始-創(chuàng)新互聯(lián)
分享網(wǎng)址:http://aaarwkj.com/article22/hccjc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供自適應(yīng)網(wǎng)站網(wǎng)站設(shè)計(jì)、定制網(wǎng)站、品牌網(wǎng)站制作、ChatGPT、搜索引擎優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站建設(shè)
亚洲综合av一区二区| 国产精品自拍国产精品| 精品国产一区二区av麻豆| 国产老熟女一区二区三区| 国产高清不卡一二三区| 精品欧美一区二区精品| 男女性视频在线免费观看| 国产视频在线一区二区| 国产怡红院在线视频观看| 91精品婷婷国产综合| 国产97精品在线播放| 国产网爆热门精品一区二区| 亚洲一区二区在线视频在线观看| 九九热这里只有免费精品| 日韩av一区二区在线| 亚洲五月综合激情综合久久| 色爱区偷拍人妻中文字幕| 亚洲一区有码在线观看| 日本日韩一区二区国产| 很黄很刺激的视频中文字幕| 深夜福利视频一区二区| 九九有点热以前的视频| 国产精品美女黄色av| 亚洲成人免费在线播放| 国产剧免费看视频网站成人| 色久悠悠婷婷综合在线亚洲| 成年免费大片黄在线观看| 日韩免费av在线观看| 日韩免费精品一区二区| 抱着操才爽的免费视频观看| 国产在线观看不卡视频| 久久国产精品午夜亚洲欧美| 色婷婷国产精品久久包臀| 可以看的黄色亚洲网站| 男女做爰高清无遮挡免费| 久久热在线视频精品视频| 99久久偷拍美女大白屁股| 国产放荡av剧情精品| 日本在线不卡二区三区| 国产乱来视频在线观看| 午夜视频在线看一区免费|