簡體   English   中英

混淆使用sizeof(...)運算符結果

[英]Confusing use of sizeof(…) operator results

我最近瀏覽了一些C ++代碼,然后遇到了以下幾行

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.

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