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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

标记化结构初始化语法(C语言)

發布時間:2025/4/5 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 标记化结构初始化语法(C语言) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
以前在看Linux代碼時,就對它的結構體初始化寫法感到奇怪,所有的初始化代碼都寫清了變量名,并且變量名前面還有一個詭異的點。最近學習Linux設備驅動,又遇到了,就查了一下,發現自己的知識果然紕漏不少,此種初始化寫法并不是什么特殊的代碼風格,而是所謂的C語言標記化結構初始化語法(designated initializer),而且還是一個ISO標準。

?

[cpp] view plaincopyprint?
  • #include?<stdio.h>? ??
  • #include?<stdlib.h>? ??
  • struct?operators???
  • {???
  • ?????void?(*read1)(char?*);???
  • ?????void?(*read2)(char?*);???
  • ?????void?(*read3)(char?*);???
  • ?????int?n;???
  • };???
  • ???
  • void?read1(char?*data)???
  • {???
  • ?????printf("read1:?%s/n",data);???
  • }???
  • void?read2(char?*data)???
  • {???
  • ?????printf("read2:?%s/n",data);???
  • }???
  • void?read3(char?*data)???
  • {???
  • ?????printf("read3:?%s/n",data);???
  • }???
  • ???
  • int?main()???
  • {????//傳統的初始化方法? ??
  • ?????//struct?operators?my_op?=?{read1,?read2,?read3,?100};????//所謂的標記化結構初始化語法? ??
  • ?????struct?operators?my_op?=?{.read2?=?read2,???
  • ???????????????????????????????.read1?=?read1,???
  • ???????????????????????????????.read3?=?read3,???
  • ???????????????????????????????.n?=?100};???
  • ?????my_op.read1("wangyang");???
  • ?????my_op.read2("wangyang");???
  • ?????my_op.read3("wangyang");???
  • ?????return?0;???
  • }??
  • #include <stdio.h> #include <stdlib.h> struct operators { void (*read1)(char *); void (*read2)(char *); void (*read3)(char *); int n; }; void read1(char *data) { printf("read1: %s/n",data); } void read2(char *data) { printf("read2: %s/n",data); } void read3(char *data) { printf("read3: %s/n",data); } int main() { //傳統的初始化方法 //struct operators my_op = {read1, read2, read3, 100}; //所謂的標記化結構初始化語法 struct operators my_op = {.read2 = read2, .read1 = read1, .read3 = read3, .n = 100}; my_op.read1("wangyang"); my_op.read2("wangyang"); my_op.read3("wangyang"); return 0; }

    ?

    重點就在于main()函數中對my_op結構體的初始化語句,使用點加變量名進行初始化。用過python的人會馬上感覺到這與關鍵字傳參是多么的相似。

    ?

    那它的好處在哪里呢?我想好處有三:

    ??? 首先,標記傳參不用理會參數傳遞的順序,正如我上面的例子表示的那樣,我是先初始化了read2,然后再初始化了read1,程序員不用記憶參數的順序;

    ??? 其次,我們可以選擇性傳參,在傳統C語言順序傳參中,如果你只想對第三個變量進行初始化,那么你不得不給第一個, 第二個參數進行初始化,而有時候一個變量并沒有很合適的默認值,而使用標記初始化法,你可以相當自由地對你有把握的參數進行初始化;

    ??? 第三,擴展性更好,如果你要在該結構體中增加一個字段,傳統方式下,為了考慮代碼修改量,你最好將新添加的字段放在這個結構體的最后面,否則你將要面對大量且無趣的修改,你可能覺得放在哪里沒什么關系,但是我們都習慣了,姓名下面是性別,性別下面是年齡,接著是興趣愛好,最后是事跡描述,如果年齡放在了最后面,難道不別扭么?!

    ?

    有人提到,該種語法還有利于提高性能,木有感覺出來,我在這里就不談這點了。

    ?

    其實,該種初始化語法并不是什么新技術,新定義,它就是ISO C99的一個標準用法,也就是說99年就有了,再說Linus也不會去趕什么時髦的,據說C Primer Plus第五版中提到了這點,不過,我沒有看過該書,遺憾,我是直接投入了面向對象的懷抱。

    ?

    GCC有擴展標記化結構初始化語法,寫法是下面這樣的:

    struct operators my_op = {read2 : read2, read1 : read1, read3 : read3,};

    ?

    ?

    轉自: http://www.hustyx.com/cplusplus/agtodXN0eWl4aWFuZ3IPCxIHQXJjaGl2ZRihigcM

    總結

    以上是生活随笔為你收集整理的标记化结构初始化语法(C语言)的全部內容,希望文章能夠幫你解決所遇到的問題。

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