在此鏈接:Raymond Chen的單身實施使用狡猾的演員?
http://blogs.msdn.com/b/oldnewthing/archive/2011/04/06/10150261.aspx
這是最近向我指出的是,下面一行:
Widget *pwidOld = reinterpret_cast<Widget*>
(InterlockedCompareExchangePointerRelease(
&reinterpret_cast<PVOID&>(g_pwidCached),
pwid, NULL));
有一個良性的,一個嚴重的問題。
良性的是static_cast可以在返回類型上完成。
嚴重者似乎是:
&reinterpret_cast<PVOID&>(g_pwidCached)
有人告訴我說,與嚴格別名,當你通過&(void *的&)g_pwidCached的函數,編譯器允許假設值g_pwidCached不會改變,因爲這種改變將通過不是對象類型的指針類型發生,並且不是char *(因爲g_pwidCached不是void *,而是Widget *)。 3.10/10似乎是相關的。
這是隻是一個特定的編譯器實現的功能,只是Visual C++保證該行將正常工作?
該代碼當然依賴於實現特定的屬性。甚至不能保證'Widget *'的大小與'void *'的大小相同,不用擔心一些名爲'InterlockedCompareExchangePointerRelease'的函數在傳遞指向'Widget *'的'void **'時會正常工作。 –
@SteveJessop:大多數代碼通常會:Widget * wid; ICEPR((無效**)婦女參與發展,...);我相信這也是不正確的,對嗎? – ForeverLearning
@SteveJessop就C++標準而言。但是這是非常特定於Windows的代碼,並且Posix和(我想)Windows都要求所有指針(包括指向Posix情況下的函數的指針)具有相同的大小和表示形式。 –