【发布时间】:2016-08-08 08:34:11
【问题描述】:
除了char,C11 中的“字符类型”实际上属于什么?
更准确地说,字符类型的特殊例外(例如,any 对象可以通过字符类型的左值表达式访问 - 请参阅 C11 标准中的 §6.5/7),以它们适用于哪些具体类型?他们似乎从stdint.h 申请uint8_t 和int8_t,但这有保证吗?另一方面,gcc 不会将 uchar.h 中的 char16_t 视为“字符类型”。
【问题讨论】:
-
还有
signed char和unsigned char。 -
请注意,
int8_t和uint8_t只是现有类型的别名。 -
已经有严肃的提议将
int8_t和uint8_t建立在扩展整数类型上,在功能上分别与signed char和unsigned char相同除了他们不会算作 §6.5/7 的“字符类型”。据我所知,没有实现过这个想法,但我也不知道有任何理由禁止它。 (例如,这样做的好处是,您现在可以拥有 没有 为程序中所有其他指针起别名的字符串指针。) -
@zwol 你的意思是使用
std::basic_string<uint8_t>等吗? -
@underscore_d 基本上是的。由于所有库函数都需要纯
char*和/或std::string,这会很尴尬,但可以做到。不过,我怀疑谨慎使用restrict至少可以获得 90% 的收益。