Изменение разделителя операторов на что-то кроме;с #define - PullRequest
0 голосов
/ 22 сентября 2018

Я использую #define для определения китайского периода。 в качестве разделителя:

#define 。 ;

Это выдает ошибку при выполнении следующего кода:

main() {
int i = 0 。
return i 。
}

Ошибка:

<stdin>: In function ‘main’:
<stdin>:11:22: error: universal character \U00003002 is not valid in an identifier
<stdin>:11:22: error: expected ‘,’ or ‘;’ before ‘。’
<stdin>:12:21: error: universal character \U00003002 is not valid in an identifier
<stdin>:14:1: error: expected declaration or statement at end of input

Однако, когда я определяю «да» как;, это работает.

1 Ответ

0 голосов
/ 22 сентября 2018

Из стандартного раздела C11 6.10.3 о заменах макросов:

Директива предварительной обработки вида

определяет идентификатор списка замен новой строки

определяет объектоподобный макрос, который вызывает замену каждого последующего экземпляра имени макроса 171) списком замены токенов предварительной обработки, которые составляют остаток директивы.Список замены затем повторно сканируется для получения дополнительных имен макросов, как указано ниже.

И здесь, в разделе 6.4.2.1:

Синтаксис

идентификатор:

идентификатор без цифры

идентификатор идентификатор без цифры

идентификатор цифры

идентификатор без цифры:

без цифры

универсальный-character-name

другие определяемые реализацией символы

недициф: один из _ abcdefghijklmnopqrstu vwxyz ABCDEFGHIJKLMNOPQRSTU VWXYZ

цифра: один из 0 1 3 4 5 6 7 8 9

Обратите внимание, что упомянутые выше универсальные имена символов являются escape-последовательностями, а не фактическим символом, как последовательность UTF-8 или UTF-16.

Невозможно сделать то, что вы пытаетесьделать в соответствии со стандартом, потому что идентификатор не может содержать символ китайского периода (независимо от того, в какой кодировке он находится).

Вы можете попробовать использовать другой препроцессор, чем cpp.Вам нужно будет найти тот, который разрешает этот символ в качестве текстового подстановочного ключа (недостатком является то, что вы теряете все остальные директивы cpp.) Я не знаю ни одного, который позволял бы это.Например, M4 имеет такое же ограничение на наборы символов в идентификаторах.

...