我正在努力学习“外部”的作用。我有一个简单的程序,在main的标题中,变量是用extern声明的。在main中,定义了该变量。 Main然后在另一个类文件中调用一个方法(包括main的标题,因此它应该可以访问外部变量),以便打印该变量的值。但我得到一个编译错误:“未解析的外部符号”int myglobal“。有人可以帮忙吗?谢谢!
如果我在source.cpp文件中删除对此变量的引用,则代码运行正常。
source.cpp
#include "main.h"
#include <iostream>
void printGlobal()
{
std::cout << "Global: " << myglobal;
}
source.h
void printGlobal();
main.h
extern int myglobal;
的main.cpp
#include "main.h"
#include "Source.h"
int main()
{
int myglobal = 5;
printGlobal();
system("pause");
return 0;
}
答案 0 :(得分:2)
extern仅适用于全局范围。如果我说extern int myint;
这意味着在任何函数之外的某个地方有int myint;
的文件,这就是全局范围
还有来自static int myint;
的文件范围,这意味着其他文件将无法通过extern访问
将main.cpp更改为
#include "main.h"
#include "Source.h"
int myglobal = 5;
int main()
{
printGlobal();
system("pause");
return 0;
}
用于文件范围
#include "main.h"
#include "Source.h"
static int myglobal = 5;
int main()
{
printGlobal();
system("pause");
return 0;
}
答案 1 :(得分:0)
extern和static关键字是存储说明符。每个存储说明符基本上为名称添加两个属性: 1.名称的分配或解除分配。 2. Visiblity。
如果你添加&#34; extern&#34;要在&#34; C&#34;中命名的关键字,它只声明一个变量,以便您可以在程序中使用该名称而不会出现编译器错误。意味着extern变量在定义它们的范围之外是可见的。此符号还指示链接器在其他对象文件中查找符号定义。因此,在您添加&#34; extern&#34;到myGlobal,你只声明了一个名为&#34; myGlobal&#34;的变量。并且可以在您的程序中使用该名称。但是当链接器来的时候,它试图找到那个&#34; myGlobal&#34;已定义,但它无法找到这个并给你&#34;未解析的外部符号&#34;错误。
所有extern(全局)变量在程序启动时分配,在程序结束时销毁。
&#34; extern&#34;的另一种用途除了A.H.提供的内容:
test1.c
int myextern = 10;
test2.c
void func1(){
int extern myextern;
printf("%d",myextern);
}
静态:
静态变量的分配/释放与外部变量相同。意味着它们在程序启动时分配,并在程序完成时销毁。但静态变量的可见性仅限于声明它们的词法范围。它们在其范围之外是不可见的。