尝试使用extern简单的东西

时间:2013-07-14 03:03:54

标签: c++ extern

我正在努力学习“外部”的作用。我有一个简单的程序,在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;
}

2 个答案:

答案 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);
}


静态:
静态变量的分配/释放与外部变量相同。意味着它们在程序启动时分配,并在程序完成时销毁。但静态变量的可见性仅限于声明它们的词法范围。它们在其范围之外是不可见的。