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。
有点迷茫...
我有一个使用 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。