簡體   English   中英

sizeof(int[1]) 是什么意思?

[英]What does sizeof(int[1]) mean?

我是 Linux 內核的新手。 我正在閱讀文件ioctl.h ,在那里我遇到了一個宏_IOC_TYPECHECK(t) ,它看起來像這樣:

#define _IOC_TYPECHECK(t) \
        ((sizeof(t) == sizeof(t[1]) && \
          sizeof(t) < (1 << _IOC_SIZEBITS)) ? \
          sizeof(t) : __invalid_size_argument_for_IOC)

你能解釋一下這段代碼嗎? 在這段代碼中, sizeof(t[1])是什么意思?

這用於檢查_IOR / _IOW / _IOWR宏的第三個參數的有效性,這應該是一個類型。 它檢查參數實際上是類型(而不是變量或數字),否則會導致編譯器或鏈接器錯誤。

  • 如果t是一種類型,則t[1]是“一個 1 t的數組”類型。 此類型與t具有相同的大小,因此sizeof(t) == sizeof(t[1])為真。

  • 如果t是一個數字,則sizeof(t)將無法編譯。

  • 如果t是一個簡單的(非數組)變量,那么t[1]將導致編譯器錯誤。

  • 如果t是數組變量,則sizeof(t) == sizeof(t[1])將為 false,並且會導致鏈接器錯誤(因為__invalid_size_argument_for_IOC未定義)。

表達式sizeof(t) < (1 << _IOC_SIZEBITS)檢查類型t的大小是否不超過ioctl允許的最大值,否則會導致相同的鏈接器錯誤。

仍然有一些無效的情況不會被這個宏捕獲 - 例如,當t是一個指向指針的指針時。

這與sizeof所有其他用途相同。 它計算表達式的大小。

在這種特殊情況下,我懷疑該檢查旨在確保t某些屬性(應該是類型名稱,而不是變量),而我從上下文中不知道這些屬性......也許可以將其視為將排除某些類型的指針(數組索引所需)。 宏旁邊的注釋說/* provoke compile error for invalid uses of size argument */這似乎支持這個理論。

請注意sizeof是一個運算符,而不是一個函數。 不需要括號,除非您想直接計算類型的大小,然后它們是表達式的一部分(它是一個強制轉換表達式)。 因此,為了清楚起見,可以將其寫為sizeof t == sizeof t[1] && ... ,或者(sizeof t == sizeof t[1])

這是一種非常好的使用方式,因為它將計算的大小“鎖定”到正確的數組,而不是重復t的類型。 因此,如果類型發生變化,表達式會自動適應並仍然計算正確的值。

出於某種原因,許多 C 程序員似乎更喜歡在所有情況下為sizeof的參數加上括號。

暫無
暫無

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

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