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

Макросы C++ должны только использоваться для: включайте защиту, введите спецификаторы или спецификаторы класса памяти

Описание

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

Макросы C++ должны только использоваться для: включайте защиту, введите спецификаторы или спецификаторы класса памяти.

Объяснение

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

Избегайте макросов, если они не используются для определения, включают защиту, вводят спецификаторы и классификаторы класса памяти. Вместо этого используйте функции, такие как подставляемая функция, const или constexpr объекты и шаблоны функций.

Реализация Polyspace

Средство проверки отмечает #define операторы, где макросы расширяются до чего-то другого, чем, включают защиту, вводят спецификаторы или спецификаторы класса памяти, такие как staticвстроенный, volatile'auto', register, и const.

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

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

Примеры

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

#ifndef IDENTIFIER //Compliant
#define IDENTIFIER //Compliant
#endif             //Compliant - Include guard

#define STOR extern      // Compliant - Storage class specifier
#define VOL volatile	 //Compliant - Type qualifier

#define CLOCK (xtal/16)              // Noncompliant
#define PLUS2(X) ((X) + 2)           // Noncompliant
#define PI 3.14159F                  // Noncompliant
#define int32_t long                 // Noncompliant
#define STARTIF if(                  // Noncompliant
#define INIT(value) {(value), 0, 0}  // Noncompliant
#define HEADER "filename.h"          // Noncompliant

В этом примере, Polyspace® флаги все макросы кроме тех, которые задают, включают защиту, спецификаторы класса памяти, и вводят спецификаторы.

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

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