如何解决理解 C
这个语句 extern int x=4;
在 C 中是什么意思?是否类似于int x=4;
?
当我在块(函数)之外编译代码 extern int x=4;
时,编译器会发出警告,而不是错误。
警告:-
警告:'x' 已初始化并声明为 'extern' extern int x=3;
与此同时,当我在块(函数)内编译代码 extern int x=4;
时,编译器会引发错误。
错误:-
错误:'x' 有 'extern' 和初始值设定项 extern int x=3;
这是怎么回事,我没听明白。extern int x=4;
语句实际上是什么意思?请明确概念。
提前致谢...
解决方法
extern
的含义有点复杂,因为 C 是随着时间的推移由不同的人尝试不同的东西开发的,而不是从一开始就知道最终产品应该是什么而设计的。
块内的 extern int x=4;
是错误的原因是它违反了 C 2018 6.7.9 5 中的这条规则:
如果标识符的声明具有块作用域,并且标识符具有外部或内部链接,则声明不应有标识符的初始值设定项。
我不确定该规则的确切动机是什么。一个动机可能是,“编译器在这里忙于定义一个函数,同时定义另一个东西对编译器来说是出乎意料的、尴尬的或困难的。”我不确定它实际上是否难以实现,但对于某些编译器,尤其是早期的编译器来说,这可能是一个问题。
发出警告的一个原因是我们通常使用带有声明的 extern
来表示“我们声明此标识符只是为了告诉您在其他地方定义的对象。”这是一个常见的做法,而不是规则。1 但是初始化说“我们在这里定义一个对象。”所以这是一个对比,编译器会警告你。但是,这并不是实际的规则违规,因此编译器不会将其报告为错误。
脚注
1 有一些规则适合这种做法。在文件范围内,int x;
是一个暂定定义,而 extern int x;
是一个不是定义的声明。这样才符合惯例; extern int x;
表示我们只是在声明 x
,而 int x;
表示我们可能正在定义它。但是,int x = 4;
和 extern int x = 4;
都是定义,不违反任何规则。
直觉上,我喜欢将 extern
视为“在另一个文件中引用(全局)对象”。不能在函数内部定义全局对象,所以这个概念没有意义。
可以初始化 extern
变量,但不推荐。如果实例化未初始化,并且您有条件地添加一组初始化变量的文件中的一个,以及多个使用它的文件。这可能是一个坏主意,但如果您在声明中屏蔽了内存的特殊部分,我可以看到它的用例。另一个用例是如果它可以是另一个文件中的全局变量,但您可能会或可能不会包括该文件。在没有外部声明的情况下,编译器会为你分配内存,并把它当作一个普通的全局变量。
如果在多个文件中初始化多个值,几乎肯定会出现链接器错误。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。