![](/img/trans.png)
[英]In C11, string literals as char[], unsigned char[], char* and unsigned char*
[英]A way to automatically cast string literals to `unsigned char*` in C?
我正在为项目使用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感到困惑。
libxml2的限定宏BAD_CAST
在xmlstring.h
:
#define BAD_CAST (xmlChar *)
可以这样使用:
xmlStrEqual(name, BAD_CAST "xml:lang")
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
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.