我的项目中违反了MISRA 5.2规则。我遇到违规的代码是在一个头文件中声明为extern的结构。代码示例如下
1.H
extern struct con tmp_ev;
2.C
struct con tmp_ev;
cioF_get(&tmp_ev);
3.C
struct con tmp_ev;
(void)eeF_read(CON, &tmp_ev);
我只在行struct con tmp_ev;
中的2.c中发出警告
符号tmp_ev的声明隐藏了符号tmp_ev
而不是3.c。 2.c和3.c都包含1.h头文件。
我很困惑为什么会出现这个问题。任何人都可以帮我解决这个问题吗?
答案 0 :(得分:3)
规则5.2规定本地范围内的变量不应隐藏具有相同名称的全局变量
您有名为tmp_ev
的局部变量和具有相同名称的全局变量。当地人正在影响全球的人。重命名本地或全局。
答案 1 :(得分:2)
你应该学习“声明”和“定义”之间的区别
C-物体。可能只有一个对象的“定义”,但任意多的“声明”。 “声明”仅仅是对象存在的一种陈述。 “definiton”确定了存在。 extern
始终是其他地方(或“此处”)的对象声明,而不是“定义”。
C文件中没有Type variable;
的声明extern
总是产生
{C}文件中variable
的定义(称为“暂定定义”)。
我对misra不熟悉(目前正在学习) 但你的架构很混乱:
文件1.h
声明一个具有全局范围的extern tmp_ev
。
文件2.c
定义具有全局范围的变量tmp_ev
。 (“暂定”)。
文件3.c
定义另一个变量tmp_ev
(同样是“暂定定义”)也具有全局范围。
因此,C文件中tmp_ev
的两个定义竞争。您现在应该决定哪个C文件(别名“编译单元”)有权定义 tmp_env
。所有其他C文件应使用extern
声明,最好使用#include "1.h"
。
请注意,C文件可以“声明”它“定义”的变量。在C程序员中,在某个标题foo_var
中声明变量foo.h
并且在名为关联的C文件中定义,这是一个常见的习惯用法foo.c
本身包含foo.h
。
答案 2 :(得分:0)
提供的代码段不应生成MISRA-C:2004规则5.2违规,因为没有内部范围和外部范围的嵌套。
但是,这违反了MISRA-C:2004规则8.9,因为您在全球范围内有tmp_ev
的两个(暂定)定义。
注意:也在"official" MISRA Forum上进行了讨论,并产生了以下回复:
规则5.2仅适用于内部范围中的标识符。从示例中不清楚2.c和3.c中的代码是存在于文件范围内还是存在于函数内。
如果" struct con tmp_ev" 2.c和3.c出现在函数定义中,将违反规则5.2。
如果" struct con tmp_ev"出现在文件范围内,违反了规则8.9,因为有两个(暂定的)定义" struct con tmp_ev"在项目中。