[英]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;
};
包含成員b
和c
的內部結構是struct outer
的未命名成員 。 此未命名成員b
和c
成員被視為包含結構的成員。
對於包含的聯合而不是包含的結構,這可能更有用。 特別是,它可用於定義類似於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;
};
};
};
這使您可以直接將i
, d
和p
稱為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.