2014-04-03 35 views
0

在保持舊代碼,使用libmxl2我得到以下錯誤:(與reinterpret_cast發生同樣的錯誤)C++最近投的錯誤

xmlNodePtr messageNode = doc->children; // The "Message" node 
if(xmlStrcmp(messageNode->name, static_cast<xmlChar*>("Message"))) ... blabla 

error: invalid static_cast 
     from type ‘const char [8]’ 
     to type ‘xmlChar* {aka unsigned char*}’ 
在下面的代碼段

很明顯,我可以用舊式鑄造(xmlChar*)來解決,但最近在C++中這樣做的正確方法是什麼?

我使用gcc 4.7.2(這編譯代碼5年前:)沒有這個錯誤最後一次,但不要問老版本編譯:)的版本)

+0

「消息」總是一個字符串文字? – Brian

+0

你需要一個const_cast,或者更好的辦法是獲得一個更新版本的xml API,希望它有更好的const正確性。 – wich

+0

const_cast也許? – INait

回答

1

後鑄件的某種組合這部作品:

const_cast<xmlChar*>(reinterpret_cast<const xmlChar *>("Message")) 
+0

拋棄'const'可能會產生問題,您必須確保該函數永遠不會嘗試和修改該參數,否則您的行爲不確定。 –

+0

@ShafikYaghmour這進入libxml我真的希望它不會修改它:) – fritzone

+0

你可能確定,但​​如果它可以避免它應該。 –

1

獲取libxml2的較新版本。該current version of the API具有以下特徵:

int xmlStrcmp (const xmlChar * str1, 
       const xmlChar * str2) 

這與您的常量字符串字面兼容。

由於您使用舊版本的libxml2,您必須將const_cast遠離文字的常量,並且依賴於庫不會嘗試修改通過它的字符串。您還需要reinterpret_cast,因爲「常規」字符通常是經過簽名而不是未經簽名的,例如,

xmlStrcmp(messageNode->name, reinterpret_cast<xmlChar*>(const_cast<char*>("Message"))) 

順便說一句,你需要一個reinterpret_cast,而不是一個普通的老static_cast是因爲你鑄造在不同類型的對象的指針類型的指針指向型的原因。

+0

+1或做'const_cast (「Message」)' – Brian

+0

@ staticx,是const_cast會擺脫這個錯誤,但總的來說,使用const_cast是非常糟糕的形式,特別是在第三方API的輸入時,因爲第三方可能會將代碼更改爲**改變字符串,然後你有一個崩潰。 – wich

+0

嗯,好點的。但是,你只能依靠你當時的API。 – Brian

0

正如已經在這裏說了幾次,就可以得到這const correct

的lib的最新版本。如果不是的因任何原因的選項,那麼你需要的是一個const_cast代替static_cast

你的代碼看起來應該像

if(xmlStrcmp(messageNode->name, 
    const_cast<xmlChar*>(reinterpret_cast<const xmlChar *>("Message")))) 

你可以告訴是這種情況,通過查看錯誤信息

error: invalid static_cast from type ‘const char [8]’ to type ‘xmlChar* {aka unsigned char*}’

兩個不兼容的類型之間的唯一區別是const修飾

0

xmlChar一些研究後typedefunsigned char 。因此,

一種解決方案是:

// use the implicit conversion to 'char*' to cast away constness: 
    char* message = "Message"; 

    // explicitly cast to 'unsigned char*' 
    unsigned char* in = reinterpret_cast<unsigned char*>(message); 
    xmlChar* test = in; 

常量性的去除通常是一個糟糕的主意,因爲字符串文字是不可修改的,但有時它與不是常量,正確的舊版庫打交道時是必要的。

char*從到unsigned char*的轉化是安全的,因爲所有對象都可以作爲charunsigned char,或signed char C中的陣列++進行處理。