为什么libxml2在C / C ++代码中到处使用“BAD_CAST”?

时间:2017-07-12 13:21:16

标签: c linux casting libxml2

据说因为libxml2使用unsigned char作为存储来使char集之间的编码/解码变得方便----强制用户在代码中的任何地方写“BAD_CAST”并不难看创建xml节点名称,内容,文本节点等

有没有办法避免到处写这样的“BAD_CAST”?设计非常糟糕。

1 个答案:

答案 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函数由编译器在没有运行时成本的情况下进行扩展。