# V2583. MISRA. Line whose first token is '#' should be a valid preprocessing directive.

Данное диагностическое правило основано на руководстве MISRA (Motor Industry Software Reliability Association) по разработке программного обеспечения.

Это правило актуально только для C. Директивы препроцессора (строки начинающиеся с '#') могут использоваться для условного включения или исключения кода из компиляции. Некорректно написанные препроцессорные директивы могут привести к некорректному включению или исключению кода, которое заранее не предполагалось. Поэтому все директивы предварительной обработки должны быть синтаксически корректны.

Рассмотрим пример:

    // #define CIRCLE
    #define SQUARE

    float processArea(float x)
    {
    #ifdef CIRCLE
      return 3.14 * x * x;
    #elf defined(SQUARE)
      return x * x;
    #else1
      return 0;
    #endif
    }

Здесь неправильно написаны директивы препроцессора '#elif' и '#else', что приведет к исключению всего кода из тела функции. Корректный вариант:

    // #define CIRCLE
    #define SQUARE

    float processArea(float x)
    {
    #ifdef CIRCLE
      return 3.14 * x * x;
    #elif defined(SQUARE)
      return x * x;
    #else
      return 0;
    #endif
    }

Данная диагностика классифицируется как:

MISRA-C-2012-20.13 MISRA-C-2023-20.13