我编写了一段代码,并通过QA C进行了分析,但它显示了一个警告'x'具有外部链接,并且正在定义而没有任何先前的声明。请帮助我理解这一点。
代码:
#include <stdio.h>
int x;
void main()
{
}
答案 0 :(得分:6)
所有这一切意味着x
可以在外面包含上述代码的翻译单元。所以它的值可以由其他翻译单位改变。
因此,编译器会警告您可能会失去程序稳定性。
但房间里的大象。修复了不可移植的void main()
原型。使用int main()
。非常好,加糖在上面。
答案 1 :(得分:5)
该工具正确警告您不要使用错误的编程习惯。我怀疑这是因为你设置静态分析仪来检查MISRA-C是否合规。
首先,MISRA-C不允许&#34;全球&#34;变量,MISRA-C:2012规则8.7:
如果是,则不应使用外部链接定义函数和对象 它们仅在翻译单元中引用。
这个变量的含义必须是TEST won't match
TES$ won't match
SPECIFIC1 won't match
NON-SPECIFIC2 won't match
SPECIFIC2 won't match
MATCHES will match
test will match
或static
。
前者是有道理的,后者几乎总是非常糟糕的编程习惯(有一些例外,比如一些extern
变量)。
现在,如果您打算使用此变量const
,那么还有另一条规则,这可能是导致错误的原因,MISRA-C:2012规则8.4:
当对象或函数时,应该可以看到兼容的声明 与外部联系定义。
意味着对于MISRA合规性,您需要在同一翻译单元中显示外部声明extern
。 MISRA建议将其放在头文件中。
另请注意,此类错误代码标记为标准过时,可能无法在将来的C版本中使用,请参阅C11 6.11.2:
6.11.2标识符的链接
在没有静态存储类的情况下在文件范围内声明具有内部链接的标识符 说明符是一个过时的功能。
即使它没有被C标记为过时的做法,你仍然应该总是避免全局变量和extern int x
,因为这是通往意大利面条编程和意大利面紧密的道路耦合。完全考虑不同的程序设计。