AUTOSAR C++14 Rule A16-0-1

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

Описание

Определение правила

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

Объяснение

Кроме безусловного и условного включения файлов и включения охранников, избегайте использования директивы препроцессора. Вместо этого используйте более безопасную альтернативу. Для образца:

  • Вместо:

    #define MIN(a,b) ((a < b)? (a) : (b))
    Можно использовать встроенные функции и шаблоны функций.

  • Вместо:

    #define MAX_ARRAY_SIZE 1024U
    Можно использовать постоянный объект.

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

Реализация Polyspace

Проверка правил не позволяет использовать директивы препроцессора. Исключение составляют только:

  • #ifdef, #ifndef, #if, #if defined, #elif, #else и #endif, только если используется для условного включения файлов и включать охрану.

  • #define только если используется для определения макросов, используемых в средствах защиты включения. Например, в этом примере макрос __FILE_H__ не позволяет включать содержимое файла заголовка более одного раза:

    /* aHeader.h */
    
    #ifndef __FILE_H__
    #define __FILE_H__
       /* Contents of header file */   
    #endif
    

    Когда #ifdef, #define и #endif используются как ограждения включения в файл заголовка, все содержимое файла заголовка должно находиться в ограждении включения.

  • #include

Шашка не позволяет использовать #define директивы в других контекстах. Если вы используете #define-s в целях, отличных от включения охранников, выполните одно из следующих действий:

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

Если вы ожидаете нарушения правил, но не видите его, обратитесь к разделу «Стандартные нарушения кодирования не отображаются».

Примеры

расширить все

#include <cstdint>       //Compliant: unconditional file inclusion

#ifdef WIN32             //Compliant: include guard
   #include <windows.h>  //Compliant: conditional file inclusion
#endif                   

#ifdef WIN32     //Noncompliant
    std::int32_t func(std::int16_t x, std::int16_t y) noexcept; 
#endif

В этом примере правило не нарушается, когда директивы препроцессора используются для безусловного и условного включения и включают ограждения. В противном случае правило нарушается.

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

Группа: Директивы предварительной обработки
Категория: Необходимый, Автоматизированный
Введенный в R2019b