我正在为项目使用libxml2,其中一个怪癖是xmlChar
是unsigned char
的typedef,而不仅仅是char
。据我所知,这对实际执行没有任何影响,但是由于我必须手动转换为const xmlChar*
,因此使用字符串文字会非常烦人。我真正想要的是能够写xmlGetProp(node, "some-property")
而不是xmlGetProp(node, (const xmlChar*)"some-property")
。它可能看起来很小,但是当每个其他语句都有(const xmlChar*)
强制转换时,它会使代码更难阅读。
有没有办法让const char*
投射到const xmlChar*
(const unsigned char*
)而无需手动演员?或者,我不应该这样做吗?
我认为这在C ++中相当容易,但我坚持使用C。
答案 0 :(得分:2)
libxml2在xmlstring.h
中定义了一个宏BAD_CAST
:
#define BAD_CAST (xmlChar *)
可以像这样使用:
xmlStrEqual(name, BAD_CAST "xml:lang")
答案 1 :(得分:1)
char *
和unsigned char *
的问题令人讨厌,因为(在2'补码中)它们都指向同一个问题。即使允许通过这些类型进行混叠,C标准也需要诊断。某些编译器可以选择抑制此情况的诊断(当您省略强制转换时)。
你可以写一些包装器:
xmlChar *VxmlGetProp(const xmlNode *node, const char *name)
{
return xmlGetProp(node, (const unsigned char *)name);
}
请注意,我没有在演员表中写const xmlChar
,因为如果您稍后重新配置libxml以使用xmlChar
的宽字符,这会导致行为失败。
您甚至可以使用const void *
作为参数类型,以允许您的函数同时使用const char *
和const unsigned char *
。
另一个选项(也会给你的代码添加一些拼写错误)将是不使用字符串文字;而是将它们放在表格中,例如
#define STRING_FOOBAR ((const unsigned char *)"foobar")
然后在代码中使用STRING_FOOBAR
。