Универсальное имя персонажа от маркерной конкатенации

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

Описание

Универсальное имя персонажа от маркерной конкатенации происходит, когда две лексемы предварительной обработки, к которым соединяют с оператором ##, создают универсальное имя персонажа. Универсальное имя персонажа начинается с \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