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

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

Описание

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

# и ## операторы не должны использоваться.

Объяснение

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

Реализация Polyspace

Polyspace ®повышения эта консультация, когда # или ## операторы используются в макроопределении.

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

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

Примеры

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

#define STRING(X) { #X }                          //noncompliant
#define CONCAT(X, Y) {X ## Y}                     //noncompliant

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

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

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

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