2010-06-10 88 views
39
struct file_operations scull_fops = { 
.owner = THIS_MODULE, 
.llseek = scull_llseek, 
.read = scull_read, 
.write = scull_write, 
.ioctl = scull_ioctl, 
.open = scull_open, 
.release = scull_release, 
}; 

該聲明使用標準的C 標記結構初始化 語法。什麼是標記結構初始化語法?

有人可以詳細說明嗎?

+4

我正在看同一本書 – 2014-01-27 00:17:54

+1

我在看同一本書到 – Lewisou 2017-09-05 02:25:28

+0

我也在看同一本書:) – 2017-10-16 10:53:45

回答

4

您正在使用結構成員的名稱來初始化結構。即每個成員初始化都用該成員的名字「標記」。

69

當您使用「傳統」ANSI C語言(C89/90)中的聚合初始值設定項({}中的初始值設定項)時,必須按順序爲每個結構成員提供單獨的初始值設定項,從第一個開始。例如

struct S { int a, b, c, d; }; 

struct S s = { 1, 2, 3, 4 }; 
/* 1 for `s.a`, 2 for `s.b` and so on... */ 

您不需要指定所有成員初始化,即你可以在任何時候停止(剩餘成員將初始化爲零)。

如果由於某種原因,你只關心顯式初始化結構的第三個成員,你必須在第一和第二部件提供「虛擬」明確的初始化(只是爲了得到想要的三分之一)

/* We only care to explicitly initialize `s.c` */ 
struct S s = { 0, 0, 3 }; 
/* but we have to explicitly initialize `s.a` and `s.b` as well */ 

或者放棄特定的初始化完全(有可能與通用= { 0 }替換它),並使用後續的分配給特定成員

struct S s = { 0 }; 
s.c = 3; 

這種基於任務的方法的一個顯着的好處是,它是獨立從struct S的聲明c成員的位置。

C語言(C99)的新規範,您可以通過內{}

struct S s = { .c = 3 }; 

提供所需的成員名字這樣使用「標記」初始化你只明確初始化所需的成員(S)(並讓編譯器將其餘部分初始化)。這不僅可以節省一些輸入,還可以使聚合初始值設定程序獨立於結構類型聲明中指定成員的順序。

您可能知道,聚合初始化器也可以用於數組。而且C99也支持使用數組進行「標記」初始化。如何在一個數組的情況下,「標籤」外觀是由下面的例子說明

int a[10] = { [5] = 3 }; 
/* `a[5]` is initialized with 3, the rest of `a` is zero-initialized */ 

值得注意的是,多一個是C語言繼續堅持「全有或全無」的方式集合初始化時間:如果你爲結構體或數組中的一個(或某些)成員指定一個顯式初始化程序,整個聚合被初始化,並且沒有顯式初始化程序的成員得到零初始化。

+0

但是C++不支持標記初始化。僅支持序列樣式。 – ShitalShah 2016-09-23 06:34:55

+0

@AnT + 1爲偉大的答案。 – 2017-10-16 11:03:43

1

這種類型的初始化值得關注的另一個好處是它允許對結構成員進行重新排序,在某些情況下,可以通過將指針指向頻繁訪問的成員放在同一硬件高速緩存行中來提高性能。