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

Why libxml2 uses "BAD_CAST" everywhere in a C/C++ code?

据说是因为libxml2使用unsigned char作为存储使得encoding/decoding之间char sets方便----强制用户写[是不是很难看=17=]代码中到处都是,当reading/creatingxml节点名称、内容、文本节点等

有没有办法避免到处写这样的"BAD_CAST"?设计真的太烂了

这个设计决定是不幸的,但根源于 40 年前做出的另一个不幸的选择:允许 char 默认情况下可能被签名,这与 getchar()、[= 的行为不一致13=]...

您可以使用内联函数通过单个隐藏转换从 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 函数由编译器扩展,没有运行时成本。