在標準c中(c89)結構標準初始化是用{}來實始化,在c99的版本,採用了採用可讀性更強的標記化實始化,這在linux核心和驅動很為常見。這是iso c99的用法。
c primer plus第五版中相關章節:
已知乙個結構,定義如下
struct book ;
c99支援結構的指定初始化專案,其語法與陣列的指定初始化專案近似。只是,結構的指定初始化專案使用點運算子和成員名(而不是方括號和索引值)來標識具體的元素。例如,只初始化book結構的成員value,可以這樣做:
struct book surprise = ;
可以按照任意的順序使用指定初始化專案:
struct book gift = ;
正像陣列一樣,跟在乙個指定初始化專案之後的常規初始化專案為跟在指定成員後的成員提供了初始值。另外,對特定成員的最後一次賦值是它實際獲得的值。例如,考慮下列宣告:
struct book gift = ;
這將把值0.25賦給成員value,因為它在結構宣告中緊跟在author成員之後。新的值0.25代替了早先的賦值18.90。
有關designated initializer的進一步資訊可以參考c99標準的6.7.8節ininialization。
其中vc++ 6.0只支援c89初始化,gcc支援自己標記化或自己擴充套件初始化。這種初始化採用 .name = value.這樣不需要按順序排序,方便調整實義,在大結構最大程度防止錯位的和調整定義帶來不便。
struct name_str;
/* 標記式初始化,注意順序不同,並可預設 */
struct name_str str =;
/* c89 初始化 */
struct name_str str2 =
;/* gcc 擴充套件初始化 */
struct name_str str3 =
在linux2.6核心中對結構體的定義形式發生了變化,不再支援原來的定義形式。
static struct file_operations test_ops = ;
這個宣告採用了標記化結構初始化語法。這種寫法是值得採用的,因為它使驅動程式在結構的定義發生變化時更具有可移植性,並且使**更加緊湊且易讀。標記化的初始化方法允許對結構成員進行重新排列。在某些場合下,將頻繁被訪問的成員放在相同的硬體快取行上,將大大提高效能
標記化結構初始化語法 C語言
以前在看linux 時,就對它的結構體初始化寫法感到奇怪,所有的初始化 都寫清了變數名,並且變數名前面還有乙個詭異的點。最近學習linux裝置驅動,又遇到了,就查了一下,發現自己的知識果然紕漏不少,此種初始化寫法並不是什麼特殊的 風格,而是所謂的c語言標記化結構初始化語法 designated in...
標準C的標記化結構初始化語法
以前在看 linux 時,就對它的結構體初始化寫法感到奇怪,所有的初始化 都寫清了變數名,並且變數名前面還有乙個詭異的點。最近學習linux裝置驅動,又遇到了,就查了一下,發現自己的知識果然紕漏不少,此種初始化寫法並不是什麼特殊的 風格,而是所謂的 c語言標記化結構初始化語法 designated ...
C 標記化結構初始化語法 點運算子
已知乙個結構體 struct point c99支援結構的指定初始化專案,結構的指定初始化專案使用點運算子和成員名 而不是方括號和索引值 來標識具體的元素。如 struct point position 這個宣告採用了標記化結構初始化語法。這種寫法是值得採用的,因為它使驅動程式在結構的定義發生變化時...