Из стандартного раздела 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 имеет такое же ограничение на наборы символов в идентификаторах.