在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

什么是指定初始化?

汽車電子技術(shù) ? 來源:宅學(xué)部落 ? 作者:王利濤 ? 2023-02-17 09:32 ? 次閱讀

什么是指定初始化

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

int a[10] = {0,1,2,3,4,5,6,7,8};

按照這種固定的順序,我們可以依次給 a[0] 和 a[8] 賦值。因?yàn)闆]有對(duì) a[9] 賦值,所以編譯器會(huì)將 a[9] 默認(rèn)設(shè)置為0。當(dāng)數(shù)組長度比較小時(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};

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

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

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

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

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

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

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

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

#include
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 分支,可以通過 case 2 ... 8: 的形式來簡化代碼。這里同樣也有一個(gè)細(xì)節(jié)需要注意,就是 ... 和其兩端的數(shù)據(jù)范圍2和8之間也要空格,不能寫成2...8的形式,否則編譯就會(huì)通不過。

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

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

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

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

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)體變量來注冊我們開發(fā)的驅(qū)動(dòng),然后以回調(diào)的方式來執(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 *,char __user *, size_t, loff_t *);
int (*mmap) (struct file *, struct vm_area_struct *);
int (*open) (struct inode *, struct file *);
 };

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

指定初始化的好處

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

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

備注

教程是《C語言嵌入式Linux高級(jí)編程》第5期:Linux內(nèi)核中的GNU C語法擴(kuò)展,文本預(yù)覽版,如果想系統(tǒng)學(xué)習(xí)Linux內(nèi)核中的各種GNU C擴(kuò)展及使用技巧,可百度搜索:“王利濤”,到51CTO學(xué)院或CSDN學(xué)院點(diǎn)擊相關(guān)課程即可開始系統(tǒng)學(xué)習(xí)。

如果您手頭暫時(shí)沒有 Linux 學(xué)習(xí)環(huán)境,也可以在 Windows 環(huán)境下安裝 C-Free 學(xué)習(xí)。教程中的 C 語言示例程序在 C-Free 環(huán)境下面也能編譯通過。當(dāng)然在這里,還是建議您使用虛擬機(jī)安裝一個(gè) Linux 學(xué)習(xí)環(huán)境,一個(gè)良好的環(huán)境更有利于我們的學(xué)習(xí),在安裝過程有什么疑惑,可以通過郵件([email protected])聯(lián)系,也可以加入QQ群(475504428),參與技術(shù)討論。

微信公眾號(hào):宅學(xué)部落

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 編譯器
    +關(guān)注

    關(guān)注

    1

    文章

    1649

    瀏覽量

    49682
  • 初始化
    +關(guān)注

    關(guān)注

    0

    文章

    50

    瀏覽量

    12021
  • 數(shù)組
    +關(guān)注

    關(guān)注

    1

    文章

    419

    瀏覽量

    26255
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    數(shù)據(jù)庫讀取時(shí)顯示指定初始化字符串不符合OLEDB規(guī)定

    如題。
    發(fā)表于 11-15 12:10

    跪求大神出現(xiàn),編譯出錯(cuò)C2450

    */}//*********************************************************************// 問題找出來了,是HCS12編譯器只支持C90,不支持C99,“指定初始化(Designated initialize
    發(fā)表于 05-08 13:23

    初始化封裝

    和仿真開始運(yùn)行)初始化封裝子系統(tǒng)。有關(guān)詳細(xì)信息,請參閱 執(zhí)行初始化命令。您可以針對(duì)以下情況添加封裝初始化代碼:指定封裝參數(shù)的初始值。例如,要
    發(fā)表于 08-27 07:17

    指定初始化在配置編程中的應(yīng)用是什么

    、我們首先會(huì)定義一個(gè)枚舉,將數(shù)組的大小和索引都用其表示;2、接著我們定義一個(gè)結(jié)構(gòu)體,有很多配置數(shù)據(jù)子屬性都表示出來了;3、最后就是初始化這個(gè)結(jié)構(gòu)體數(shù)組了,例如經(jīng)常會(huì)用到以下形...
    發(fā)表于 12-15 07:29

    Linux內(nèi)核中的C語言語法擴(kuò)展

    收集一些感覺比較好的博客鏈接,方便以后再看Linux 內(nèi)核中的 C 語言語法擴(kuò)展Linux 內(nèi)核驅(qū)動(dòng)中的指定初始化宏構(gòu)造利器:語句表達(dá)式Linux 內(nèi)核第一宏:container_of零長
    發(fā)表于 12-15 06:04

    基于OK6410-A的ARM11開發(fā)Linux系統(tǒng)討論

    初始化方式---指定初始化。因?yàn)椴抛T浩強(qiáng)的書上也沒有提到過,看過了一些C語言書也沒有提到過。今天一查,原來這個(gè)是C99標(biāo)準(zhǔn),這個(gè)目前也是最新的標(biāo)準(zhǔn),之前我也清楚這件事,但是沒意識(shí)到這是一個(gè)差別。網(wǎng)上
    發(fā)表于 06-14 15:53

    請問Xtensa C++編譯器的C++17版本是否支持指定初始化器呢?

    我的 ESP-IDF v5.0 應(yīng)用程序是用 C++ 編寫的。在我的主 CMakeList.txt 中,我有以下設(shè)置:代碼:set(CMAKE_CXX_STANDARD 17)set(CMAKE_CXX_STANDARD_REQUIRED ON)我在 `main.cpp` 中添加了以下語句來檢查:代碼:std::cout
    發(fā)表于 03-01 06:39

    請問Xtensa C++編譯器的C++17版本是否支持指定初始化器?

    我的 ESP-IDF v5.0 應(yīng)用程序是用 C++ 編寫的。在我的主 CMakeList.txt 中,我有以下設(shè)置:set(CMAKE_CXX_STANDARD 17)set(CMAKE_CXX_STANDARD_REQUIRED ON)我在 `main.cpp` 中添加了以下語句來檢查:std::cout
    發(fā)表于 04-14 08:55

    RealView編譯工具4.0版編譯器參考指南

    時(shí),Switch語句中的大小寫范圍可用。當(dāng)源語言為C90或非嚴(yán)格C++時(shí),可使用C99風(fēng)格的指定初始化器。 要在GNU模式下編譯,請使用編譯器選項(xiàng)--gnu。
    發(fā)表于 08-18 06:13

    手機(jī)模塊初始化向?qū)?/a>

    手機(jī)模塊初始化向?qū)?為了剛好的對(duì)手機(jī)模塊進(jìn)行初始化,所以把最基本的向?qū)懴聛?本向?qū)нm用于本公司的西門子TC35I和華為GT9000模塊。一、在初始化手機(jī)模塊前,請先確定DT
    發(fā)表于 09-18 09:41 ?17次下載

    RDA1846S初始化設(shè)置

    RDA1846S初始化設(shè)置RDA1846S初始化設(shè)置RDA1846S初始化設(shè)置
    發(fā)表于 01-15 17:08 ?0次下載

    標(biāo)簽HF I PRO應(yīng)答器芯片的命令和選項(xiàng)的詳細(xì)資料概述

    識(shí)別設(shè)備(RFID)和軟件開發(fā)的工程師,并且希望將擴(kuò)展的命令和附加的標(biāo)簽HF I PRO應(yīng)答器芯片/嵌入到自己的閱讀器中。該參考指南應(yīng)與ISO/IEC 15693標(biāo)準(zhǔn)一起使用,該標(biāo)準(zhǔn)指定初始化應(yīng)答器和讀取器之間通信所需的標(biāo)準(zhǔn)協(xié)議、命令和其他參數(shù)。
    發(fā)表于 08-07 17:00 ?4次下載
    標(biāo)簽HF I PRO應(yīng)答器芯片的命令和選項(xiàng)的詳細(xì)資料概述

    ob<x>jective-C中的變量和數(shù)據(jù)類型的詳細(xì)資料詳解

    編寫初始化時(shí),遵循兩個(gè)策略:如果你的類包含多個(gè)初始化方法,其中一個(gè)就應(yīng)該是指定的(desigrated)初始化方法,并且其他所有初始化方法都
    發(fā)表于 10-12 15:38 ?2次下載

    C語言指定初始化器解析及其應(yīng)用

    C90 標(biāo)準(zhǔn)要求初始化程序中的元素以固定的順序出現(xiàn),與要初始化的數(shù)組或結(jié)構(gòu)體中的元素順序相同。但是在新標(biāo)準(zhǔn) C99 中,增加了一個(gè)新的特...
    發(fā)表于 02-07 11:28 ?2次下載
    C語言<b class='flag-5'>指定</b><b class='flag-5'>初始化</b>器解析及其應(yīng)用

    C語言使用一維數(shù)組注意事項(xiàng)

    如果在定義數(shù)值型數(shù)組時(shí),指定了數(shù)組的長度并對(duì)之初始化,凡未被“初始化列表”指定初始化的數(shù)組元素,系統(tǒng)會(huì)自動(dòng)把它們
    的頭像 發(fā)表于 03-09 11:37 ?1352次閱讀
    主站蜘蛛池模板: 被男同桌摸内裤好爽视频 | 天堂网站 | 亚洲阿v天堂2018在线观看 | 奇米影视777欧美在线观看 | 免费午夜影片在线观看影院 | 亚洲视频久久 | 日本一区不卡在线观看 | 91视频综合网 | 8050午夜一级二级全黄 | 丁香婷婷开心激情深爱五月 | 最好看的2019中文字幕1 | 国产欧美一区二区日本加勒比 | 男人你懂的在线观看视频 | 婷婷综合久久狠狠色99h | 亚洲午夜影视 | 亚洲色图国产精品 | 91欧美精品激情在线观看 | 欧美一级特黄aaaaaaa在线观看 | 亚洲精品资源 | 亚洲黄网站wwwwww | 亚洲精品视频免费 | 日韩一级视频免费观看 | 四虎精品影院在线观看视频 | 国产精品天天看 | 特级毛片aaaa免费观看 | 伊人久久大香线蕉电影院 | 天天影视欧美综合在线观看 | 黄色短视频软件 | www.亚洲免费 | 国产欧美日韩视频免费61794 | 视频免费观看视频 | 免费看va| 久久草在线播放 | 伊人狼人综合 | 中国一级特黄特级毛片 | 欲色影视 | 三级黄色在线观看 | 人人干人人艹 | 精品国产免费观看久久久 | 午夜免费片在线观看不卡 | 在线天堂中文在线资源网 |