2012-07-12 31 views
0

來源如下:NSSizeFromCGSize只不過是一個演員操作?

NS_INLINE NSSize NSSizeFromCGSize(CGSize cgsize) { 
    union _ {NSSize ns; CGSize cg;}; 
    return ((union _ *)&cgsize)->ns; 
} 

對我來說這只是看起來像一個過於複雜的鑄件(讀取內存塊不同於原本打算)。是否有這個語法需要的原因?我只問,因爲我從來沒有見過這個。

回答

1

是的,這實際上是一個演員。在C中,因此Objective-C中,不能將一種結構類型轉換爲另一種結構類型,這通常是件好事!然而,你可以投一個指向任何東西的指針別的 - 這在一般的危險......

所以,如果,且僅當,你真的知道兩個結構是相同的,你可以從一個變量的值強制轉換一個結構類型通過取變量(&cgsize)的地址,鑄造得到的指針((union _ *)),然後取消引用指針(->ns)來獲取類型轉換值的其他結構類型的值。任何體面的編譯器都會優化它,並直接複製值。

+0

嗯,有趣的,我不帶有任何錯誤時,試圖簡單地投,但也許這是因爲他們在相同的64位typedef操作。謝謝(你的)信息! – borrrden 2012-07-12 14:17:47

+0

@borrrden - 你是對的,你可以在「投」的東西本身 - 這是一個NOP - 而在64位的NS和CG幾何類型只是彼此的別名,所以「投」的作品。有一個(未記錄的)限定'這似乎允許的類型是否相同的測試NSGEOMETRY_TYPES_SAME_AS_CGGEOMETRY_TYPES' - 它是目前或者與值'1'或未定義的(而不是與取值爲0所定義的),可以定義使用'#if defined(NSGEOMETRY_TYPES_SAME_AS_CGGEOMETRY_TYPES)&&(NSGEOMETRY_TYPES_SAME_AS_CGGEOMETRY_TYPES == 1)'來測試它。 – CRD 2012-07-12 20:01:29

相關問題