exponenta event banner

Правило AUTOSAR C++ 14 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 только в том случае, если используется для определения макросов, используемых в защитных элементах include. Например, в этом примере макрос __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