2010-07-29 112 views
1

我不知道爲什麼這個簡單的代碼不工作。有人能解釋我嗎?C++ reinterpret_cast

int main() 
{ 
    const char* c = "ret"; 
    typedef unsigned char GOK_UINT8; 
    typedef GOK_UINT8* pGOK_UINT8; 
    const pGOK_UINT8 y = reinterpret_cast<const GOK_UINT8*>(c); 

    return 0; 
} 

有人可以告訴我爲什麼reinterpret_cast應該不起作用嗎?

謝謝, Gokul。

+0

還要注意的是'reinterpret_cast'是一個很鈍的工具,應該非常謹慎使用。 – 2010-07-29 08:26:33

+1

提示:將複合語句拆分爲原子並將它們放置在單獨的行上是在您認爲它的代碼段中確實存在* is *問題的好的第一步。 (請參閱我對sbi的評論。) – DevSolar 2010-07-29 10:42:54

回答

12

有人能告訴我爲什麼reinterpret_cast應該不起作用嗎?

AFAICS,該reinterpret_cast應該工作正常,但事後的分配應該引起錯誤。

這是因爲,const GOK_UINT8*是非const指針constGOK_UINT8對象,而const pGOK_UINT8const指向非const對象。
前者保護所引用的對象,後者指向對象的指針。如果允許分配,則可以更改const GOK_UINT8*旨在防止更改的對象。


請注意,typedef ed指針的行爲很奇怪。這是因爲C語言中的const奇怪的聲明語法C++:A const保護它的左邊的東西,除非沒有任何東西,那麼它保護它的權利。因此,在T constT const*中,T類型的對象受到保護,而在T* const中,指向T類型對象的指針受到保護。如果你有

typedef T* TPtr; 

然後TPtr const再次使指針constconst TPtr也是如此。一個typedef ed指針指向const或非const對象,你不能改變這一點。您不能將const填入TPtr附近,並期望保護指針所指向的對象。

(順便說一句,這就是爲什麼STL類必須同時定義一個iteratorconst_iterator。)

+2

+1,正確答案。 @Gokul:試試這個而不是第6行:'const GOK_UINT8 * tmp = reinterpret_cast (c); const pGOK_UINT8 y = tmp;'。你會看到reinterpret_cast工作正常,這是分配中的類型不匹配導致錯誤。話雖如此,請注意,您的代碼展示了大量不良編碼實踐,因爲它有行......我希望這僅用於實驗。 ;-) – DevSolar 2010-07-29 08:26:28

2

沒錯SBI是正確的。

相應修改你的代碼,

const char* c = "ret"; 
typedef unsigned char GOK_UINT8; 
typedef const GOK_UINT8* pGOK_UINT8; 
pGOK_UINT8 y = reinterpret_cast<const GOK_UINT8*>(c); 
printf("%s", y);