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++
По умолчанию: On для рукописного кода, off для сгенерированного кода
Синтаксис командной строки : PRE_UCNAME_JOIN_TOKENS
Влияние: Низкое
Введенный в R2018a