2012-08-28 40 views
2

在C11標準有下列通過嵌套在單個聯合內的結構共同的初始序列的定義:普通的初始序列 - 在C標準定義

6.5.2.3/6

一個特殊的保障是爲了簡化使用工會提出: 如果工會包含共用一個初始 序列幾種結構(見下文),而如果聯合對象當前包含一個 這些結構,它是每個以檢查其中任何一個的共同初始部分 任何地方都可以看到該工會的完成類型 的聲明。兩個結構共享一個通用初始值 序列如果相應成員對於一個或多個初始成員的序列具有兼容類型(並且對於 位字段,寬度相同)。

例3下面是一個有效的片段:

union { 
    struct { 
     int alltypes; 
    } n; 

    struct { 
     int type; 
     int intnode; 
    } ni; 

    struct { 
     int type; 
     double doublenode; 
    } nf; 
} u; 

u.nf.type = 1; 
u.nf.doublenode = 3.14; 
/* ... */ 
if (u.n.alltypes == 1) 
     if (sin(u.nf.doublenode) == 0.0) 
      /* ... */ 

根據我這篇文章的理解上面的代碼,但是,是無效的。

在外部if陳述我們表明n::alltypes數據成員處於活動狀態(同時與ni::typenf::type爲標準狀態),但在內部if我們使用nf::doublenode這是不常見的初始序列的一部分。

有人可以澄清這個問題嗎?

+1

'nf.doublenode'分配在'3.14'的註釋上方。這種行爲與「同時活躍」無關,只是工會工作的基礎。 – oldrinb

+0

上面的代碼是創建類似於Pascal變體記錄的東西,根據選擇器字段(本例中爲'alltypes' /'type'),您可以擁有不同類型的記錄/結構。 – ninjalj

回答

4

它允許檢查的[共享共同初始序列幾種結構]

使用所提供的示例中的共用初始部分,本說明書的該部分是說,由於每個可能的部件類型的union具有int作爲初始字段,則可以使用任意的成員類型即使在之後也可以訪問該公共初始字段,該變量已被初始化/用作特定成員類型之一。

這是例如不只是什麼:它訪問以下作爲nf字段具有初始化的初始int作爲nalltypes構件,後,然後前進到訪問nfdoublenode字段,所有使用相同的變量。

使用union作爲可能的類型之一不會強制它成爲某種結構:這就是工會的工作方式。

請注意,此保證已存在一段時間:在ANSI specification中找到基本相同的文本,部分爲:3.3.2.3結構和聯合成員

+0

對,我不好。我不知道爲什麼,但我只是認爲爲'u.nf.doublenode'賦值會模糊u.nf.type的內容 - 什麼是完全的廢話,因爲它們出現在同一個結構中:) – Quentin

+0

@Quentin類似的用法_could_「模糊」以下領域的內容,如果他們不常見。例如,在'if'中的代碼之後,你不能以定義的方式訪問'u.ni.intnode'。 – pb2q

+0

C++標準對於聯合的一個成員的指針是否可以用來檢查聯合的另一個成員的公共初始序列的一部分,或者關於CIS規則是否適用於通過缺少工會類型的實際對象?正如所寫的,CIS規則使得可以編寫可接受指向任何具有已知初始序列的結構類型的指針的函數,並檢查該初始序列的成員,但gcc對c99的解釋使其對該目的無用,除非代碼使用「 -fno嚴格-aliasing'。 – supercat