[英]Confusing use of sizeof(…) operator results
static char zsocket_name[sizeof((struct sockaddr_un*)0)->sun_path] = {};
...這很令人困惑,因為它看起來好像sizeof
運算符的結果被指針取消引用以訪問名為sun_path
的結構字段,並且該值將用於在靜態存儲中調整數組的大小。
但是,當我嘗試使用簡單的代碼片段程序來調整表達式sizeof((struct sockaddr_un*)0)->sun_path
,它會生成sockaddr_un
結構的sun_path
成員的大小。
顯然,這就是原始作者的意圖; 但我發現它在語法上令人困惑,因為它看起來像是對sizeof(…)
操作結果的指針取消引用。
關於sizeof(…)
使用,我有什么遺漏? 為什么這個表達式以這種方式評估?
在C ++中,除了更常見的sizeof( type )
之外, sizeof
運算符還有一個表單sizeof expression
,所以這個:
sizeof ((struct sockaddr_un*)0)->sun_path
相當於:
sizeof(decltype(((struct sockaddr_un*)0)->sun_path))
前者雖然沒有空格,但卻是您發布的代碼中的內容。
請注意,帶括號的表達式也是一個表達式,因此sizeof ((struct sockaddr_un*)0)->sun_path
也可以使用額外的括號編寫: sizeof(((struct sockaddr_un*)0)->sun_path)
- 即使這看起來與sizeof( type )
形式一樣,它實際上是應用於帶括號的表達式的sizeof expression
形式。
你唯一不能做的是sizeof type
,所以這是無效的 :
sizeof decltype(((struct sockaddr_un*)0)->sun_path)
在C ++中獲取struct的字段而不將0
轉換為指針的更現代的方法是使用declval
:
sizeof std::declval<sockaddr_un>().sun_path
你的錯誤是認為sizeof
就像一個函數調用,而它實際上是一個運算符。 根本不需要使用()
。
sizeof
實際上是sizeof expression
的運算符,並且()
around expression
不是必需的。 表達式中sizeof
的優先級實際上等於++
和--
(前綴形式),一元+
和-
, !
和~
(邏輯和按位不是), (type)
類型轉換, &
(地址),一元*
(指針間接)和(2011年的C) _Alignof
。 所有這些都具有從右到左的相關性。
優先級高於sizeof
的唯一運算符是++
和--
(后綴形式),函數調用( ()
), []
數組下標, .
和->
訪問struct成員,(僅限1999年的C)復合文字(type){list}
。
沒有sizeof(expression)
形式。 sizeof x
計算表達式x
的結果大小(不評估x
)。 sizeof (x)
再次評估表達式(x)
的結果大小,而不進行評估。 您碰巧有一個表單sizeof a->b
的表達式(由於優先級規則)等於sizeof (a->b)
而不是sizeof(a)->b
(這會觸發編譯錯誤)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.