AUTOSAR C++14 Rule A16-0-1

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

Описание

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

Препроцессор должен только использоваться в безусловном и условном включении файла и включать защиту и использовать следующие директивы: (1) #ifndef, (2) #ifdef, (3) #if, (4) #if defined, (5) #elif, (6) #else, (7) #define, (8) #endif, (9) #include.

Объяснение

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

  • Вместо:

    #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
    

    Когда #ifdefDefine и #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