MISRA C++:2008 Rule 16-0-8

Если # лексема появится как первая лексема на линии, то это должно сразу сопровождаться лексемой предварительной обработки

Описание

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

Если # лексема появится как первая лексема на линии, то это должно сразу сопровождаться лексемой предварительной обработки.

Объяснение

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

Директивы препроцессору могут использоваться, чтобы исключить фрагменты кода от компиляции. Компилятор исключает код, пока это не сталкивается с #else, #elif, или #endif директива препроцессору. Если одна из тех директив препроцессору уродлива, компилятор продолжается, исключая код вне намеченной конечной точки, приводящей к ошибкам и неожиданному поведению, которое может затруднить, чтобы диагностировать.

Избегайте уродливых директив препроцессору путем размещения лексемы препроцессора непосредственно после # лексемы. А именно, не помещайте символы кроме пробела между # лексемой и лексемой препроцессора в #else и #endif директивах.

Реализация Polyspace

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

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

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

Примеры

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

#define TESTING_H       //Compliant

namespace Example
{
#ifndef TESTING_H       //Compliant
    // code here
#elseX;                 //Noncompliant
    // code here
#else;                  //Compliant
    // code here
#endnif                 //Noncompliant
    // code here
  }

};

Поскольку elseX не директива препроцессору и следует непосредственно после # символа Polyspace отмечает ее как несовместимую.

#endnif не правильно сформированная директива препроцессору. Polyspace отмечает его как несовместимый.

#define TESTING_H, #ifndef TESTING_H, и #else правильно сформированные условные выражения препроцессора и совместимы с этим правилом.

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

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