Ted*_*edi 3 c gcc hal stm32 c89
我有点困惑...
我有一个使用STM32 HAL库的嵌入式项目,该库又使用了stm32f072rb CMSIS头文件。
HAL 在这里声称它是严格的ANSI-C
The source code of drivers is developed in Strict ANSI-C, which makes it
independent from the development tools. It is checked with CodeSonarTM static
analysis tool. It is fully documented and is MISRA-C 2004 compliant.
Run Code Online (Sandbox Code Playgroud)
我相信严格的ANSI-C意味着C89,所以我将这些gcc标志添加到了我的Makefile中。
CFLAGS = -std=c89\
-pedantic-errors
Run Code Online (Sandbox Code Playgroud)
但是,当我这样做时,会给出很多错误和警告。如果删除这些标志,它将进行编译。
我对此感到非常困惑。我是否缺少某些东西或他们的文档有误?
这是一些启用了该标志的gcc编译器错误...它们在许多STM32 HAL文件中不断重复。
error: expected '=', ',', ';', 'asm' or '__attribute__' before 'void'
error: unknown type name 'inline'
error: expected '=', ',', ';', 'asm' or '__attribute__' before 'NVIC_GetPriority'
Run Code Online (Sandbox Code Playgroud)
error: unknown type name 'inline' 指向C99附带的功能。
我怀疑问题在于他们的文档中显示“ ANSI-C”。“ ANSI-C”是一个垃圾术语,实际上在大多数情况下确实引用C89。自1990年以来,ANSI与C标准不再相关,因此,在1990年之后一直谈论“ ANSI-C”的人都感到困惑,请参阅C,C99,ANSI C和GNU有什么区别? C?。
您的编译器选项适用于严格的C89 / C90代码。尝试使用进行编译-std=c99 -pedantic-errors。
但是,MISRA-C:2004明确不允许使用C99功能,因此非常麻烦。包含的代码inline绝对不符合MISRA-C:2004。对于C99支持,需要MISRA-C:2012。