Каков наилучший способ гарантировать ASCII как во время компиляции, так и во время выполнения? - PullRequest
0 голосов
/ 08 февраля 2020

Меня вдохновляет этот ответ .

Единственный способ, которым я подумал, - это комбинация static_assert (C11-далее) и assert.

В основном, ascii.h файл с кучей

static_assert(' ' == 32);
static_assert('!' == 33);
// ...

операторов и затем функцией

static void assert_runtime_ascii(void) {
    assert(' ' == 32);
    assert('!' == 33);
    // ...
}

, которая должна быть выполнена в main.

This слишком многословно (200+ строк), что делает это непрактичным, поэтому я просто прокомментирую это

// NOTE: this program expects ASCII both at run-time and compile-time.

и все будет сделано.

Есть ли лучший способ?

I не удалось найти #define как __STDC_IEC_559__ для ASCII в стандарте.

Есть ли лучший способ?

1 Ответ

0 голосов
/ 08 февраля 2020

лучший способ гарантировать ASCII как во время компиляции, так и во время выполнения?

Похоже, что OP хочет знать, как обнаружить набор символов выполнения кодирование и кодирование ввода / вывода пользователя.

Во время компиляции или во время выполнения, чтобы обнаружить ASCII, используйте серию _Static_asserts или asserts (пример кода) для большинства из 128 ASCII символов, которые входят в набор C language исполнительных символов . 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

Обратите внимание, что такие символы, как "$, @,` ", не являются частью набора символов выполнения so", если нет соответствующего члена, он преобразуется в определяемый реализацией элемент, отличный от нулевого (широкого) символа ".


Чтобы обнаружить кодирование ввода / вывода пользователя, я не вижу решения, кроме как попросить пользователя ввести справочный текст и код, проверяющий его.

...