假设有一个 C 头文件:
//void test(void);
inline void test(void) {}
Run Code Online (Sandbox Code Playgroud)
如果我们注释掉第一行,MISRA C 检查器会抱怨
类型:MISRA C-2012 声明和定义(MISRA C-2012 规则 8.4,必需)分类不可用。标头.h:3:
- Misra_c_2012_rule_8_4_violation:函数定义没有可见的原型。
我不明白为什么内联函数也需要原型。谢谢。
MISRA C 强制使用原型,因为它允许 C90,其中非原型函数声明是一个大问题。而且还要避免链接器错误并避免声明和定义之间的不一致。例如,考虑inline void f()称为f(123)- 有效的 C99,但会导致神秘的链接器错误。
8.4 具体是关于在编写具有外部链接的函数声明之前强制执行函数声明。大多数时候,您不希望内联函数具有外部链接。事实上,另一条 MISRA C 规则 8.10 通过声明内联函数来强制它们始终具有内部链接static,其原因是为了避免未定义的行为,如该规则的基本原理所述。
另一个功能和/或微妙的安全问题是,如果您在标头内定义函数,则该函数将存在于包含标头的每个翻译单元中。因此,您最终会得到多个具有相同名称的函数 - 通常会导致链接器错误。除非您还提供函数内部链接,否则 C 编译器/链接器将利用名称修饰来分隔不同的函数。
| 归档时间: |
|
| 查看次数: |
131 次 |
| 最近记录: |