STM32 HAL C标准

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)

Lun*_*din 5

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。