exponenta event banner

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

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

Описание

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