头文件中的静态内联函数和misra c规则8.5问题

头文件中的静态内联函数和misra c规则8.5问题,c,embedded,inline,misra,rl78,C,Embedded,Inline,Misra,Rl78,我使用的是IAR RL78和RL78-R5F10BGG微控制器。我还在IAR中启用了MISRA C 2004 我想将我的一个函数定义为内联函数。这个内联函数应该在各种c文件中使用。所以我在我的一篇文章中定义了这个函数 头文件,并将该头文件包含在所有需要该函数的c文件中。但我的问题是因为编译后的MISRAC8.5规则。它说: 错误[Pm123]:头文件MISRA C 2004规则8.5中不应定义对象或函数 以下是common.h标头中内联函数的定义: static inline int16u SE

我使用的是IAR RL78和RL78-R5F10BGG微控制器。我还在IAR中启用了MISRA C 2004

我想将我的一个函数定义为内联函数。这个内联函数应该在各种c文件中使用。所以我在我的一篇文章中定义了这个函数

头文件,并将该头文件包含在所有需要该函数的c文件中。但我的问题是因为编译后的MISRAC8.5规则。它说:

错误[Pm123]:头文件MISRA C 2004规则8.5中不应定义对象或函数

以下是common.h标头中内联函数的定义:

static inline int16u SET_BIT(int16u int16uVar, int16u int16uBitIndex);

#pragma inline=forced
static inline int16u SET_BIT(int16u int16uVar, int16u int16uBitIndex)
{
     int16uVar |= ( (int16u)1u << (int16uBitIndex) );

     return int16uVar ;
}
有什么问题吗


有什么办法可以解决这个问题吗?

MISRA-C:2004不包括C99,因此您根本无法使用内联

正因为如此,关于头文件中函数定义的规则甚至在内联函数中也很直截了当。您无法通过发布的代码遵守MISRA-C:2004-您必须创建与几个必需规则的偏差

我的建议是升级到MISRA-C:2012,该版本对本场景规则5.9有一个明确的例外:

例外情况 具有内部链接的内联函数可以在多个翻译单元中定义,前提是所有这些定义都是在每个翻译单元中包含的相同头文件中定义的

MISRA-C:2012还要求所有内联函数必须声明为静态规则8.10

MISRA-C:2012在几乎所有方面都是一份更好的文件。IAR也支持2012版本,他们的MISRA检查器应该是一个独立的插件,与特定的MCU无关


与您的实际问题无关int16u1u谢谢您的帮助回答。 关于您回复的第二部分,我应该说,在我们的编码风格中,我们使用int16u来表示无符号int类型。就是

typedef unsigned int int16u
所以我把unsigned int换成signed int。我的问题中有一个输入错误,那就是,我已经写了

int16uVar |= ( (int16u)1u << (int16uBitIndex) );
但我的代码中正确的一行是

int16uVar |= ( (int16u)1 << (int16uBitIndex) );
很抱歉。

简单地说,内联不是MISRA C:2004涵盖的C90的一部分

但是,如果您采用。。。这引入了偏差许可的概念,MISRA团队方便地为您提供了使用内联许可/MISRA/C:2004/1.1.C.1的信息

当然,大多数编译器只是忽略了内联限定符


利益声明:见简介

哎呀,你真的不应该这样称呼你的类型。int16_t vs int16u,易于混淆。无论如何,铸造应在MISRA-C:2004基础类型转换后进行。MISRA-C实际上是汽车行业的标准,随着AUTOSAR越来越被接受,uint8/sint8、uint8/uint16等类型。。。实际上是在平台类型中定义的。h包括在标准类型中。h。实际上应该使用它来代替编译器stdint.h。第二,这不是一个C错误,而是C语言及其抽象机器的定义。位运算是如何工作的,包括impl定义和未定义的行为,不仅是8/16位MCU,还有32位MCU。@kesselhaus不,这是不正确的。ISO C比MISRA-C更为佳能,MISRA-C比AUTOSAR更为佳能。此外,MISRA-C仅仅用于汽车已经很久了。现在每个人都在使用它,即使是在嵌入式系统之外。关于左移位,只有将负数移位,或者将数据移位到有符号数的符号位时,才是危险且未定义的。这意味着在有符号16变量上,左移15位或更多总是一个错误。从无符号类型转换为有符号类型,正如我所认为的,是非常值得怀疑的。调用undefined behavior=bug的代码。特别是在汽车行业,几乎所有OEM现在都在要求AUTOSAR,如果他们必须支持多个OEM,至少一级供应商会这样做。在这里,stdint.h是并且不应该直接使用。顺便说一句,32位MCU与sint32有相同的问题。有符号左移将被定义为未定义的行为,有符号右移实现定义的行为。是的,现在MISRA-C可能也在汽车之外使用,我刚刚从auromotive env上的MISRA-C猜到。什么是int16u?u后缀是否表示无符号?在这种情况下,是否要使用uint16\u t from?