0
我遇到了一些代碼,如下所示奇怪的語法:爲得到一個成員的大小在一類
#define SIZE_M(klass, mem) sizeof(((klass*)0)->mem)
我不熟悉的語法(klass*)0)
什麼它的目的是。它是取消引用成員mem
的指針,但是在這種情況下,0
在默認情況下mem是不存在的嗎?
我遇到了一些代碼,如下所示奇怪的語法:爲得到一個成員的大小在一類
#define SIZE_M(klass, mem) sizeof(((klass*)0)->mem)
我不熟悉的語法(klass*)0)
什麼它的目的是。它是取消引用成員mem
的指針,但是在這種情況下,0
在默認情況下mem是不存在的嗎?
表達式((klass*)0)
是鑄造。我們將表達式0從通常類型轉換爲klass*
類型,這意味着它將成爲指向klass
的指針。編寫這個表達式的目的是我們需要一個klass*
類型的對象,但是我們不知道如何得到它,因爲不同的類對於如何構建它們有不同的限制。所以我們有點作弊,並使這個空指針,並告訴編譯器它有一個klass*
類型。然後我們可以得到這個虛假對象中的一個成員,並詢問編譯器它使用的是多大的數字sizeof
。表達式全部在編譯時評估。
實際表達式未被評估。 – LogicStuff
[**'sizeof' **](http://en.cppreference.com/w/cpp/language/sizeof)不符合你的想法(更重要的是,*當*) 。 – WhozCraig
你還會怎樣寫它? 'sizeof(mem)'將不起作用,因爲'mem'不在範圍內。 –