2012-07-01 133 views
4

所以沒有,這不是做事情的最好方法。然而,爲了理論的緣故,,如何成功地將指針值分配給匿名結構的指針?C++匿名結構指針賦值

#pragma pack(push,1) 
    struct 
    { 
     __int16 sHd1; 
     __int16 sHd2; 
    } *oTwoShort; 
#pragma pack(pop) 

    oTwoShort = (unsigned char*)msg; // C-Error 

生產:

錯誤C2440: '=':無法從 '無符號字符*' 轉換到 '<無名型oTwoShort> *'

示例假定msg本身就是一個有效的指針。

這可能嗎?既然你沒有實際的類型,你甚至可以強制轉換嗎?

回答

11

您可以decltype獲取類型:

oTwoShort = reinterpret_cast<decltype(oTwoShort)>(msg); 

此溶液中加入C++ 11的,因此它將不適用於較舊的編譯器。 Boost的實現大致相同(BOOST_PROTO_DECLTYPE),旨在與較老的編譯器一起工作。它有一些限制(例如,如果內存提供服務,則每個作用域只能使用一次),但無論如何它可能總比沒有好。

+1

BOOST_PROTO_DECLTYPE是否適用於沒有鏈接的類型(如匿名類型)?我找不到任何確鑿的文檔,並試圖提出一個可能的實現我總是遇到這樣的問題,即不能將不具有鏈接的類型用作C++ 03中的模板參數,即使它是從一個從函數參數。 –

+0

@CharlesBailey:好問題。說實話,現在你提到它,我懷疑我曾經嘗試過將它與一個沒有鏈接的類型一起使用,所以我不確定。 –

5
reinterpret_cast<unsigned char*&>(oTwoShort) = reinterpret_cast<unsigned char*>(msg); 

但是,真的嗎?

+1

似乎是最便攜,更-所以比使用'decltype'。 – Qix

+2

@ Di-0xide,「但是,真的嗎?」 – Griwes

+0

@Griwes - 哈哈。就像我在OP中所說的那樣,這僅僅是爲了理論的緣故。 :]我不*實際*實現像這樣的結構。 – Qix

7

我認爲你必須使用C++ 11的decltype

oTwoShort = reinterpret_cast<decltype(oTwoShort)>(msg); 
+0

優雅,但不適用於較低版本的VC++。 – Qix

+1

+1。好答案! –

+1

@ Di-0xide:是的,它是C++ 11特有的。 –

0

至於說你不能這樣做指針轉換,但你可以這樣做:

memcpy(&oTwoShort,&msg,sizeof(void*)); 
+0

該規範指出指針類型不必是相同的大小,所以這在技術上是未定義的行爲。 – Qix