簡體   English   中英

這是一個C11匿名結構嗎?

[英]Is this a C11 anonymous struct?

我正在調查C11草案,它說

沒有標記的結構類型的未命名成員稱為匿名結構; 沒有標記的聯合類型的未命名成員稱為匿名聯合。 匿名結構或聯合的成員被視為包含結構或聯合的成員。

所以我構建了以下測試用例

// struct type with no tag
typedef struct {
  unsigned char a;
  unsigned char b;
  // ... Some other members ...
  unsigned char w;
} AToW;

union
{
  AToW; // <- unnamed member
  unsigned char bytes[sizeof(AToW)];
} myUnion;

Clang和GCC都抱怨這位未透露姓名的成員,並說該聲明沒有效果。 我做錯了什么,還是他們根本不支持這個功能呢?

不,那不是一個未命名的成員。

一個例子是:

struct outer {
    int a;
    struct {
        int b;
        int c;
    };
    int d;
};

包含成員bc的內部結構是struct outer未命名成員 此未命名成員bc成員被視為包含結構的成員。

對於包含的聯合而不是包含的結構,這可能更有用。 特別是,它可用於定義類似於Pascal或Ada變體記錄的內容:

enum variant_type { t_int, t_double, t_pointer, t_pair };
struct variant {
    enum variant_type type;
    union {
        int i;
        double d;
        void *p;
        struct {
            int x;
            int y;
        };
    };
};

這使您可以直接將idp稱為struct variant對象的成員,而不是為變體部分創建人工名稱。 如果某些變體需要多個成員,則可以在匿名聯合中嵌套匿名結構。

(它與Pascal和Ada的不同之處在於,在給定type成員的值的情況下,沒有機制來強制執行哪個變體是活動的;那對你來說是C。)

在您的示例中, AToW是您之前定義的結構類型的typedef。 你不被允許裸露

AToW;

在結構定義的中間,你可以擁有一個裸露的東西

int;

C11增加了在另一個結構中定義嵌套匿名結構的能力,但只能在此時定義一個新的匿名結構類型。 您不能擁有先前定義類型的匿名結構成員。 語言可以被定義為允許它,並且語義(我認為)相當簡單 - 但是定義兩種不同的方法來做同樣的事情並沒有多大意義。 (對於上面的“struct”,請閱讀“struct or union”。)

引用N1570草案 (非常接近2011版ISO C標准),第6.7.2.1節第13段:

類型說明符是沒有標記的結構說明符的未命名成員稱為匿名結構 ; 一個未命名的成員,其類型說明符是一個沒有標記的聯合說明符,稱為匿名聯合 匿名結構或聯合的成員被視為包含結構或聯合的成員。 如果包含的結構或聯合也是匿名的,則遞歸應用。

結構說明符由關鍵字struct ,后跟可選標識符(本例中省略的標記),后跟{}包含的一系列聲明組成。 在您的情況下, AToW是類型名稱,而不是結構說明符,因此它不能用於定義匿名結構

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM