为什么 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
函数由编译器扩展,没有运行时成本。
据说是因为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
函数由编译器扩展,没有运行时成本。