缺少对象定义声明(规则 MisraC2012-8.4)

Missing declaration for object definition (Rule MisraC2012-8.4)

我试图了解如何处理此错误:
必需:缺少对象定义的声明 [hi](规则 MisraC2012-8.4)
我的代码是:

typedef struct {
    int l;
} some_struct;

some_struct hi = {
    5
};

int main(void) {
    return(0);
}


static 解决了这个问题,但我需要使用这个变量作为另一个文件的外部变量。

规则 8.4 是关于对象与外部链接的类型不兼容。该规则旨在防止可能存在的严重错误:在一个文件中将对象声明为一种类型,然后在另一个文件中将其定义为另一种类型。

为了防止此类错误,MISRA 因此要求对象的先前 extern 声明对包含定义的文件可见。

因此,如果您打算在文件范围内定义 some_struct hi,则还必须在某处添加一个声明,最好是在头文件中:

extern some_struct hi;

static 解决了这个问题,因为那时你不再有外部链接,规则也不适用。

请注意(非常量)extern 意大利面条式全局变量在任何形式的程序、MISRA 或非 MISRA 中都非常不鼓励。在绝大多数可能的情况下,程序中存在此类全局变量是由于程序设计不当造成的。