МИСРА C 2004 и c99

Правило 1.1 MISRA C 2004 указывает, что спецификация распространяется на c90, а не на c99.

Я хотел бы использовать библиотеки stdint и stdbool вместо того, чтобы писать свои собственные. Кто-нибудь сделал это исключение в своей реализации MISRA?


person JeffV    schedule 15.01.2013    source источник
comment
Правило 6.3 в действительности рекомендует определяемую пользователем реализацию stdint.h, поэтому, если ваш компилятор поддерживает stdint.h (и/или stdbool.h в этом отношении), то я думаю, что это оправданное отклонение (согласно параграфу 4.3.2) для их использования.   -  person Andrew    schedule 22.01.2013


Ответы (1)


Вы обязательно должны использовать имена типов из stdint.h. Вот как я решил это в соответствии с MISRA-C: 2004:

#ifdef __STDC_VERSION__ 
  #if (__STDC_VERSION__ >= 199901L)  /* C99 or later? */
    #include <stdint.h>
    #include <stdbool.h>
  #else
    #define C90_COMPILER
  #endif /* #if (__STDC_VERSION__ >= 199901L) */
#else
  #define C90_COMPILER
#endif /* __STDC_VERSION__  */


#ifdef C90_COMPILER
  typedef unsigned char uint8_t;
  typedef unsigned int  uint16_t;
  typedef unsigned long uint32_t;
  typedef signed char   int8_t;
  typedef signed int    int16_t;
  typedef signed long   int32_t;

  #ifndef BOOL
    #ifndef FALSE
      #define FALSE 0u
      #define false 0u
      #define TRUE  1u
      #define true  1u
    #endif

    typedef uint8_t BOOL;
    typedef uint8_t bool;
  #endif
#endif /* C90_COMPILER */
person Lundin    schedule 16.01.2013