我编写了以下一段代码并通过 QA C 进行了分析,但它显示了警告“x”具有外部链接,并且正在定义而没有任何先前的声明。请帮助我理解这一点。
Code:
#include <stdio.h>
int x;
void main()
{
}
该工具正确地警告您不要使用不良的编程习惯。我怀疑这是因为您设置了静态分析器来检查 MISRA-C 合规性。
首先,MISRA-C 不允许“全局”变量,MISRA-C:2012 规则 8.7:
在以下情况下,不应使用外部链接来定义函数和对象:
它们仅在翻译单元中被引用。
这意味着这个变量要么必须是static
or extern
.
前者是有道理的,后者几乎总是非常糟糕的编程实践(除了一些例外,例如某些const
变量)。
现在,如果您打算拥有这个变量extern
,那么还有另一条规则,这可能是错误的原因,MISRA-C:2012 规则 8.4:
当对象或函数
定义了外部链接。
这意味着为了遵守 MISRA,您需要有外部声明extern int x
在同一翻译单元内可见。 MISRA 建议将其放入头文件中。
另请注意,像这样的不良代码已被标准标记为过时,并且可能无法在 C 的未来版本中工作,请参阅 C11 6.11.2:
6.11.2 标识符的链接
在文件范围内声明具有内部链接的标识符,而无需静态存储类
说明符是一个过时的功能。
即使它没有被 C 标记为过时的做法,你仍然应该always避免全局变量和extern
,因为这是通向意大利面条式编程和意大利面条式紧耦合的道路。考虑完全不同的程序设计。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)