2016-04-15 25 views
0

我遇到了一些代碼,如下所示奇怪的語法:爲得到一個成員的大小在一類

#define SIZE_M(klass, mem)  sizeof(((klass*)0)->mem) 

我不熟悉的語法(klass*)0)什麼它的目的是。它是取消引用成員mem的指針,但是在這種情況下,0在默認情況下mem是不存在的嗎?

+0

實際表達式未被評估。 – LogicStuff

+0

[**'sizeof' **](http://en.cppreference.com/w/cpp/language/sizeof)不符合你的想法(更重要的是,*當*) 。 – WhozCraig

+0

你還會怎樣寫它? 'sizeof(mem)'將不起作用,因爲'mem'不在範圍內。 –

回答

4

表達式((klass*)0)鑄造。我們將表達式0從通常類型轉換爲klass*類型,這意味着它將成爲指向klass的指針。編寫這個表達式的目的是我們需要一個klass*類型的對象,但是我們不知道如何得到它,因爲不同的類對於如何構建它們有不同的限制。所以我們有點作弊,並使這個空指針,並告訴編譯器它有一個klass*類型。然後我們可以得到這個虛假對象中的一個成員,並詢問編譯器它使用的是多大的數字sizeof。表達式全部在編譯時評估。

相關問題