我有点困惑......
我有一个使用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'
答案 0 :(得分:5)
error: unknown type name 'inline'
指向使用C99添加的功能。
我怀疑问题在于他们的文档是" ANSI-C"。 " ANSI-C"这是一个垃圾术语,确实大部分时间都是指C89。自1990年以来,ANSI不再与C标准无关,所以那些一直在谈论" ANSI-C"在1990年之后简直困惑,请参阅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。
答案 1 :(得分:1)
引用Wikipedia:
ANSI C,ISO C和标准C是指美国国家标准协会(ANSI)和国际标准化组织(ISO)发布的C编程语言的连续标准。
所以似乎“ANSI C”没有明确定义,并没有说正在使用特定版本的C标准。
由于它明显使用inline
,因此必须至少为C99,所以试试吧。它对我有用......
答案 2 :(得分:0)
为进一步澄清,所讨论的文件(大部分类似于core_cm.h之类的文件(取决于您所使用的MCU))具有条件代码。在您的特定情况下,它令人窒息
静态内联...
根据您使用的编译器,有条件地将和STATIC以及INLINE定义为不同的事物。 GCC将为条件代码提供正确的定义( GNUC ),但是如上所述,您需要为inline关键字指定C99。
仅供参考,//注释也是C99,而不是C89 / C90。