在ISO/IEC 9899:1999的第6.7.7節中類型定義,第三個示例(在邊界上標記的第6段)不正確。從該示例中的解釋是這樣(參見底部的代碼):沒有類型說明符的類型限定符
前兩個比特的字段聲明在無符號的不同是 類型說明符(這迫使
t
是一個結構部件的名稱), 而const
是類型限定符(其改變t
是 作爲typedef名稱)仍然可見。
它聲明const t:5
將使類型名稱t
的先前定義保持不變。如果我們使用gcc進行測試,我們發現我們可以改變這個變量,所以gcc忽略了const t
。用clang編譯也是一樣。
我明白,這是有可能存在的變量定義/通過類型修飾符沒有類型說明符,這違背了我的信念,即預選賽只有保持一個類型說明符節點的屬性等
聲明C99的歧義在哪裏?
typedef signed int t;
typedef int plain;
struct tag {
unsigned t:4;
const t:5;
plain r:5;
};
int
main()
{
t x;
x = 10;
return 0;
}
在另一方面,像下一個函數也是編譯:
int
main()
{
struct tag x = {.t = 3};
x.t = 4;
return 0;
}
REMARK:
我用鐺和gcc。
DOCUMENTS:
頁138,§6.7.8從這個版本
ISO/IEC 9899:201X委員會草案 - 2011年4月12日N1570
OR
第124頁,第6.7節。TC3委員會草案 - 2007年9月7日WG14/N1256
它不是重新定義的類型定義,它的修改類型用於在您添加了預選賽的具體變量。 – Barmar
看來,.t可以修改,看到更新的功能。 – alinsoar