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

Препроцессор должен только использоваться для включения файла и включать защиту

Описание

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

Препроцессор должен только использоваться для включения файла и включать защиту.

Объяснение

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

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

Реализация Polyspace

Polyspace® повышает нарушение этого правила во включенном заголовочном файле, когда любое из этих условий верно:

  • #define используется за пределами включать защиты. Они #define операторы обычно задают константы и подобные функции макросы.

  • #ifndef используется за пределами включать защиты.

Polyspace рассматривает эту идиому, когда правильные включают защитную идиому:

#ifndef <identifier>
#define <identifier>
#endif

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

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

Примеры

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

file1.hmain.cpp

#ifndef MY_FILE
#define MY_FILE //Compliant
#endif
#define PI 3.1416 //Noncompliant
constexpr double pi = 3.1416;

#include"file1.h"
//...

В этом примере включайте файл file1.h содержит два #define операторы. Первый #define директива используется во включать защите. Эта директива совместима с этим правилом. Второй #define директива задает постоянный макро-PI. Эта директива несовместима с этим правилом, и Polyspace отмечает его. Лучшая альтернатива должна использовать constexpr переменная.

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

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