一种在C中自动将字符串文字转换为`unsigned char *`的方法?

时间:2014-12-08 23:54:17

标签: c casting libxml2 string-literals

我正在为项目使用libxml2,其中一个怪癖是xmlCharunsigned 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。

2 个答案:

答案 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