C代码中的QA警告消息

问题描述:

我编写了一段代码并通过QA C进行分析,但它显示警告'x'具有外部链接,并且正在定义之前没有任何先前的声明。请帮助我理解这一点。C代码中的QA警告消息

代码:

#include <stdio.h> 
int x; 
void main() 
{ 
} 
+0

谢谢@gregor – Santz

+1

[重新打开](http://*.com/posts/37672587/revisions)的任何具体原因? [有什么具体的标记重复丢失了吗?](http://*.com/q/5110055/2173917) –

+0

QA C是否设置为每次机会检查MISRA合规性? – Lundin

该工具正确地警告您不要使用错误的编程习惯。我怀疑这是因为你已经设置了静态分析器来检查MISRA-C的符合性。

所有MISRA-C首先不允许“全局”变量,MISRA-C:

功能和对象不应该与如果 他们只在引用外部链接的定义:2012第8.7条规则翻译单位。

这个变量的含义是staticextern

前者是有道理的,后者几乎总是非常糟糕的编程习惯(除了一些例外,像一些const变量)。现在

,如果你打算有这个变量extern,然后还有另一个规则,这是有可能的错误,MISRA-C的原因:2012第8.4条规则:

兼容的声明应是可见的时定义了具有外部链接的对象或功能 。

这意味着对于符合MISRA,您需要在同一个翻译单元内可见extern声明extern int x。 MISRA建议将它放在一个头文件中。

同时请注意,不好这样的代码被标记的标准过时,并在C未来版本可能无法正常工作,请参见C11 6.11.2:

标识符

6.11.2的联系

在没有静态存储类 说明符的文件范围内声明具有内部链接的标识符是过时的功能。

即使它不是用C标记为过时的做法,你还是应该始终避免全局变量和extern,因为这是走向面条编程和意大利面紧密耦合。完全考虑一个不同的程序设计。

它的意思是,x可能是可访问的外部含有上述代码翻译单元。所以其价值可能被其他翻译单位改变。

因此,编译器警告您可能会失去程序稳定性。

房间里的大象。修复非便携式void main()原型。使用int main()。漂亮,请在糖上面。

+0

这不是一头大象,它是一匹死马...如果OP的代码是用于嵌入式系统的,那么这种主要格式就是完美的,便携的。 [见此](http://*.com/a/31263079/584518)。此外,QA C不是编译器,而是静态分析器。 – Lundin