在维护使用libmxl2的旧代码时,我收到以下错误:
error: invalid static_cast
from type ‘const char [8]’
to type ‘xmlChar* {aka unsigned char*}’
在以下代码中:
xmlNodePtr messageNode = doc->children; // The "Message" node
if(xmlStrcmp(messageNode->name, static_cast<xmlChar*>("Message"))) ... blabla
(reinterpret_cast
发生同样的错误)
显然我可以使用旧样式转换(xmlChar*)
来解决,但最近在C ++中这样做的正确方法是什么?
我使用gcc 4.7.2(这段代码是5年前编译的最后一次:)没有这个错误,但是不要问旧编译器的版本:))
答案 0 :(得分:2)
经过一些演员组合后,这可行:
const_cast<xmlChar*>(reinterpret_cast<const xmlChar *>("Message"))
答案 1 :(得分:1)
获取更新版本的libxml2。 current version of the API具有以下签名:
int xmlStrcmp (const xmlChar * str1,
const xmlChar * str2)
哪个与你的const字符串文字兼容。
当您使用较旧版本的libxml2时,您必须const_cast
远离文字的常量并依赖于库而不是尝试修改您传递它的字符串。您还需要reinterpret_cast
作为&#34;常规&#34;字符通常是签名而不是无符号,例如
xmlStrcmp(messageNode->name, reinterpret_cast<xmlChar*>(const_cast<char*>("Message")))
顺便说一句,你需要reinterpret_cast
而不是普通的旧static_cast
的原因是因为你正在将指针类型转换为指向不同类型对象的指针类型。
答案 2 :(得分:0)
如前所述,您可以获得最新版本的lib const correct
如果由于任何原因不能选择,那么您需要的是const_cast
而不是static_cast
您的代码应该是
if(xmlStrcmp(messageNode->name,
const_cast<xmlChar*>(reinterpret_cast<const xmlChar *>("Message"))))
您可以通过查看错误消息
来判断是这种情况错误:static_cast无效 来自'const char [8]'类型 输入'xmlChar * {aka unsigned char *}'
两种不兼容类型之间的唯一区别是const修饰符
答案 3 :(得分:0)
xmlChar
typedef
到unsigned 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;
删除constness通常是一个坏主意,因为字符串文字不可修改,但有时在处理不是const-correct的旧库时是必要的。
从char*
到unsigned char*
的转换是安全的,因为在C ++中可以将所有对象视为char
,unsigned char
或signed char
的数组。