STM32 HAL C标准

STM32 HAL C standard

有点迷茫...

我有一个使用 STM32 HAL 库的嵌入式项目,该库又使用 stm32f072rb CMSIS 头文件。

HAL 声称 here 它是 严格的 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.

我相信 Strict ANSI-C 意味着 C89,所以我将这些 gcc 标志添加到我的 Makefile 中。

CFLAGS =            -std=c89\
                    -pedantic-errors

但是当我这样做时,它会给出很多错误和警告。如果我删除这些标志,它会编译。

我对此很困惑。是我缺少什么还是他们的文档有误?

这里有一些启用标志的 gcc 编译器错误...它们不断重复许多 STM32 HAL 文件。

error: expected '=', ',', ';', 'asm' or '__attribute__' before 'void'
error: unknown type name 'inline'
error: expected '=', ',', ';', 'asm' or '__attribute__' before 'NVIC_GetPriority'

引用 Wikipedia:

ANSI C, ISO C and Standard C refer to the successive standards for the C programming language published by the American National Standards Institute (ANSI) and the International Organization for Standardization (ISO).

所以似乎"ANSI C"没有明确定义,没有说正在使用哪个特定版本的C标准。

既然明明用的是inline,那肯定是C99以上的,试试吧。它对我有用...

error: unknown type name 'inline' 指向随 C99 添加的功能。

我怀疑问题是他们的文档说 "ANSI-C"。 "ANSI-C" 是一个垃圾术语,确实大部分时间都指的是 C89。从1990年开始,ANSI已经和C标准没有任何关系了,所以那些在1990年之后一直在谈论"ANSI-C"的人简直一头雾水,见What is the difference between C, C99, ANSI C and GNU C?.

您的编译器选项对于严格的 C89/C90 代码是正确的。尝试用 -std=c99 -pedantic-errors 编译。

但是,MISRA-C:2004 明确不允许使用 C99 功能,所以这是可疑的。包含 inline 的代码绝对不符合 MISRA-C:2004。对于 C99 支持,需要 MISRA-C:2012。

为了进一步澄清,有问题的文件,主要类似于 core_cm.h(取决于您使用的 MCU),有条件代码。在您的特定情况下,它会窒息

静态内联...

STATIC 和 INLINE 有条件地定义为不同的东西,具体取决于您使用的编译器。 GCC 将为条件代码提供正确的定义 (GNUC),但如前所述,您需要为内联关键字指定 C99。

仅供参考,// 注释也是 C99,而不是 C89/C90。