3

我正在尝试了解“extern”的作用。我有一个简单的程序,在 main 的头文件中,用 extern 声明了一个变量。主要是定义该变量。然后 Main 调用另一个类文件中的方法(包括 main 的标头,因此它应该可以访问外部变量),以便打印该变量的值。但我得到一个编译器错误:“未解析的外部符号“int myglobal”。有人可以帮忙吗?谢谢!

如果我在 source.cpp 文件中删除对这个变量的引用,代码运行良好。

源码.cpp

#include "main.h"
#include <iostream>

void printGlobal()
{
    std::cout << "Global: " << myglobal;
}

源码.h

void printGlobal();

主文件

extern int myglobal;

主文件

#include "main.h"
#include "Source.h"

int main()
{
    int myglobal = 5;
    printGlobal();
    system("pause");
    return 0;
}
4

2 回答 2

2

extern 仅适用于全局范围。如果我说extern int myint;这意味着某处有一个文件int myint;在任何功能之外,这是全局范围

还有一个文件范围是 via 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;
}
于 2013-07-14T03:08:39.360 回答
0

extern 和 static 关键字是存储说明符。每个存储说明符基本上为名称添加两个属性: 1. 名称的分配或解除分配。2. 可见性。

如果您在“C”中将“extern”关键字添加到名称中,它只会声明一个变量,以便您可以在程序中使用该名称而不会出现编译器错误。意味着外部变量在定义它们的范围之外是可见的。该符号还指示链接器在其他目标文件中查找符号定义。因此,在您将“extern”添加到 myGlobal 的情况下,您只声明了一个名为“myGlobal”的变量,并且可以在程序中使用该名称。但是当链接器出现时,它试图找到定义“myGlobal”的位置,但它无法找到它并给你“未解析的外部符号”错误。

所有外部(全局)变量在程序启动时分配,在程序结束时销毁。

除了 AH 提供的以外,“extern”的另一种用法:

test1.c
 int myextern = 10;

test2.c

void func1(){
  int extern myextern;
  printf("%d",myextern);
}


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

于 2013-07-14T04:28:16.637 回答