[英]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.