MISRA C++:2008 Rule 16-3-1

Должно быть самое большее одно вхождение # или ## операторов в одном макроопределении

Описание

Управляйте определением

Должно быть самое большее одно вхождение # или ## операторов в одном макроопределении.

Объяснение

Оценка # и ## операторов препроцессора не имеет заданного порядка выполнения. Когда больше чем одно вхождение # или ## операторов существует в одном макроопределении, это неясно, какой оператор препроцессора выполняется сначала компилятором. Неопределенность в порядке выполнения может привести к беспорядку разработчика или неожиданным макро-вычислениям. Используйте только один из # или ## операторов препроцессора для каждого макроопределения.

Реализация Polyspace

Polyspace ®повышения этот дефект каждый раз, когда больше чем один экземпляр # или ## операторов используется в одном макроопределении.

Поиск и устранение проблем

Если вы ожидаете нарушение правила, но не видите его, относитесь, чтобы Диагностировать, Почему Кодирующие Стандартные Нарушения Не Появляются как ожидалось.

Примеры

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

#define STRING(X) { #X }                          //compliant
#define CONCAT(X, Y) {X ## Y}                     //compliant
#define STRING_CONCAT(x, y) {#x ## y}             //noncompliant
#define MULTI_CONCAT(x, y, xy, z) {x ## y ## z}   //noncompliant

Поскольку макро-STRING_CONCAT использование оба # и ## операторы, Polyspace отмечает макрос как несовместимый.

Polyspace отмечает макро-MULTI_CONCAT как несовместимый, потому что это использует несколько ## операторы.

Проверяйте информацию

Группа: предварительная обработка директив
Категория: необходимый
Введенный в R2013b