【发布时间】:2020-05-24 03:15:42
【问题描述】:
我的灵感来自this answer。
我想到的一种方法是static_assert(C11-onwards)和assert的组合。
基本上,一个ascii.h 文件有一堆
static_assert(' ' == 32);
static_assert('!' == 33);
// ...
语句,然后是函数
static void assert_runtime_ascii(void) {
assert(' ' == 32);
assert('!' == 33);
// ...
}
在main执行。
这太冗长(200 多行),不切实际,所以我只是评论一下
// NOTE: this program expects ASCII both at run-time and compile-time.
然后完成。
有没有更好的办法?
我在标准中找不到像 __STDC_IEC_559__ 这样的 #define 用于 ASCII。
有没有更好的办法?
【问题讨论】:
-
在什么方面不切实际?只需包含文件即可。
-
实际上,你不需要 200 行。如果
' ' == 32、'!' == 33、'0' == 48、'A' == 65和'a' == 97',您可以 99+% 确定您拥有与 ASCII 兼容的字符集(可能是 Latin-1 或某种 Unicode)。如果您担心将区域字符推入 ASCII 范围的旧 7 位字符集,请检查更多标点符号。但请记住,如果您的代码是在非 ASCII 系统上编译的,那么它将是从您输入的 ASCII 编码转换而来的。 -
可能使用几个
const char字符串的哈希值? -
断言 ASCII 编码有什么意义?当您构建代码时,您知道操作系统在该特定架构上的编码,因此当您可以将
-DNOT_ASCII=1选项传递给编译器时,您无需检查任何内容。跨度> -
“太冗长(200 多行)”不清楚,因为 ASCII 只定义了 128 个字符。
标签: c language-lawyer