为啥“extern”关键字在同一个文件中不起作用?
Posted
技术标签:
【中文标题】为啥“extern”关键字在同一个文件中不起作用?【英文标题】:Why doesn't the "extern" keyword work in the same file?为什么“extern”关键字在同一个文件中不起作用? 【发布时间】:2020-12-08 21:10:57 【问题描述】:请参阅下面的示例代码以了解“extern”的使用。当我在代码中使用 extern 关键字时,出现编译错误。请提出问题的解决方案。
#include<iostream>
extern int x;
extern int y;
extern int z;
int main()
x = 10;
y = 15;
z = (x>y ? x: y);
std::cout<<z;
return 0;
错误信息:
example8.cpp:(.rdata$.refptr.z[.refptr.z]+0x0): undefined reference to `z';
example8.cpp:(.rdata$.refptr.y[.refptr.y]+0x0): undefined reference to `y';
example8.cpp:(.rdata$.refptr.x[.refptr.x]+0x0): undefined reference to `x';
F:\DEVC_workspace\collect2.exe [Error] ld returned 1 exit status
【问题讨论】:
提示:改变你的观点。您的期望更有可能是错误的,而不是 extern “不起作用”。你觉得这段代码中extern
的作用是什么?此外,您正在寻找解决方案的“问题”还不清楚。你可以简单地删除extern
,“问题”就消失了
extern int x;
的意思是“声明x
有这种类型,但这里没有定义。”但是你永远不会在任何地方定义x
。
而且错误信息不是编译错误。它们是链接器错误。
病人说,“医生,我这样做的时候很痛”。医生说:“那就不要那样做!”
您的问题类似于“当我将变量声明为 const 时,我无法修改它。为什么 const
损坏?”。您必须解释您的推理路线,以便其他人可以指出您的误解
【参考方案1】:
疑虑解除。解决的问题(代码编辑)
#include<iostream>
extern int x = 0;
extern int y = 0;
extern int z = 0;
int main()
x = 10;
y = 15;
z = (x>y ? x: y);
std::cout<<z;
return 0;
或
#include<iostream>
extern int x;
extern int y;
extern int z;
int main()
int x = 10;
int y = 15;
int z = (x>y ? x: y);
std::cout<<z;
return 0;
参考: 示例 1:
extern int var;
int main(void)
var = 10;
return 0;
This program throws an error in compilation because var is declared but not defined anywhere. Essentially, the var isn’t allocated any memory. And the program is trying to change the value to 10 of a variable that doesn’t exist at all.
示例 2:
#include "somefile.h"
extern int var;
int main(void)
var = 10;
return 0;
Assuming that somefile.h contains the definition of var, this program will compile successfully.
来源:geeksforgeeks:Link,建议:@Calculuswhiz 感谢@Jeffrey
【讨论】:
请注意,前两个块不是extern
的本意,也不能解决代码的根本问题。没有实际理由声明一个外部变量并在同一个文件中定义它。以const
类比,这就像使用const_cast
修改您事先在代码中声明为const
的变量。
@Calculuswhiz 是的,你是对的。如前所述,这只是一个初学者实验代码(没有在任何地方使用过的代码)。当我们想在外部文件中使用实例时使用“extern”,它仅用于此目的。【参考方案2】:
extern int x;
告诉编译器:“我将在其他编译单元中为您提供int x
”。请期待在链接时找到它。
所以,你需要另一个文件:
example8b.cpp
int x = 0;
int y = 0;
int z = 0;
您需要在项目中链接这两个文件。
但最重要的是:
是什么让您选择将x
、y
和z
作为extern 放在首位?
结束下面的讨论:
extern int x;
表示“某处会有一个 x”
int x;
表示“请在此处输入x
”
undefined reference to x
的意思是“我没有找到你想要的 x 在哪里”
编译器需要一个放置x
的地方。你没有给它这样的地方,因为extern
特别要求编译器不要把x
放在那里。错误是编译器告诉你把x
放在某个地方。
【讨论】:
所以,你需要另一个文件:: 所以,我们不能在同一个文件中定义和声明带有'extern'的变量? @SaikatGuha “extern”的缩写是什么? 是什么让您选择将 x、y 和 z 作为 extern 放在首位? :: 我在用户代码中看到了它。因此正在探索“volatile”、“auto”和“extern”的使用。所以,这只是一个测试文件,用于使用 'extern'。 @Calculuswhiz : 'extern' 用于全局定义变量。 @SaikatGuha 抱歉,不,extern
不是这个意思(提示:external)。我不确定你从哪里得到的。阅读this。它很好地解释了它。以上是关于为啥“extern”关键字在同一个文件中不起作用?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 private(set) 在 Swift 中不起作用?