【问题标题】:What's the best way to guarantee ASCII both at compile-time and run-time?在编译时和运行时保证 ASCII 的最佳方法是什么?
【发布时间】: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


【解决方案1】:

在编译时和运行时保证 ASCII 的最佳方式?

听起来OP想知道如何检测执行字符集编码和用户I/O编码。

在编译时运行时,要检测 ASCII,对 128 个 ASCII 字符中的大部分字符使用一系列 _Static_assertsasserts (example code),即C 语言执行字符集的一部分。 C11 §5.2.1 3

A to Z
a to z
0 to 9
! " # % & ’ ( ) * + , - . / : ; < = > ? [ \ ] ^ _ { | } ~
space character, 
  and control characters representing horizontal tab, vertical tab, and form feed.
some way of indicating the end of each line of text

注意像“$,@,`”这样的字符不是执行字符集的一部分所以“如果没有对应的成员,它会被转换成一个实现定义的成员而不是空(宽)字符”适用。


为了检测用户输入/输出的编码,我没有看到除了要求用户输入参考文本和代码检查之外的解决方案。

【讨论】:

    猜你喜欢
    • 2013-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-27
    • 1970-01-01
    • 2012-02-08
    • 2011-09-04
    • 1970-01-01
    相关资源
    最近更新 更多