据说因为libxml2使用unsigned char
作为存储来使char集之间的编码/解码变得方便----强制用户在代码中的任何地方写“BAD_CAST”并不难看创建xml节点名称,内容,文本节点等
有没有办法避免到处写这样的“BAD_CAST”?设计非常糟糕。
答案 0 :(得分:4)
这个设计决定是不幸的,但根植于40年前的另一个不幸的选择:允许char
默认签名,这与getchar()
strcmp()
的行为不一致} ...
您可以使用内联函数将char *
转换为unsigned char *
,反之亦然,并使用单个隐藏转换,并在传递参数时使用这些:
static inline unsigned char *c2uc(char *s) { return (unsigned char*)s; }
static inline char *uc2c(unsigned char *s) { return (char*)s; }
这些包装器比基本类型转换器更安全,因为它们只能应用于一种类型并转换为其unsigned
对应物。常规强制转换是有问题的,因为它们可以应用于任何类型和隐藏类型转换错误。 static inline
函数由编译器在没有运行时成本的情况下进行扩展。