Universal character name from token concatenation

Вы создаете универсальное имя персонажа путем присоединения лексем с ## оператор

Описание

Этот дефект происходит когда две лексемы предварительной обработки, к которым соединяют с ## оператор создает универсальное имя персонажа. Универсальное имя персонажа начинается с \u или \U сопровождаемый шестнадцатеричными цифрами. Это представляет символ, не найденный в наборе основного символа.

Например, вы формируете символьный \u0401 путем присоединения двух лексем:

#define assign(uc1, uc2, val) uc1##uc2 = val
...
assign(\u04, 01, 4);

Риск

Стандарт C11 (Секунда. 5.1.1.2), утверждает, что, если универсальное имя персонажа формируется маркерной конкатенацией, поведение не определено.

Фиксация

Используйте универсальное имя персонажа непосредственно вместо того, чтобы произвести его посредством маркерной конкатенации.

Примеры

развернуть все

#define assign(uc1, uc2, val) uc1##uc2 = val

int func(void) {
    int \u0401 = 0;
    assign(\u04, 01, 4); 
    return \u0401;
}

В этом примере, assign макрос, когда расширено, соединяет эти две лексемы \u04 и 01 сформировать универсальное имя персонажа \u0401.

Коррекция — использует Универсальное имя персонажа непосредственно

Одна возможная коррекция должна использовать универсальное имя персонажа \u0401 непосредственно. Коррекция переопределяет assign макрос так, чтобы это не соединяло лексемы.

#define assign(ucn, val) ucn = val

int func(void) {
    int \u0401 = 0;
    assign(\u0401, 4); 
    return \u0401;
}

Информация о результате

Группа: Программирование
Язык: C | C++
Значение по умолчанию: На для рукописного кода, прочь для сгенерированного кода
Синтаксис командной строки: PRE_UCNAME_JOIN_TOKENS
Удар: низко
Введенный в R2018a