497

我正在阅读“Think in C++”,它只是介绍了extern声明。例如:

extern int x;
extern float y;

我想我理解它的含义(没有定义的声明),但我想知道它什么时候证明有用。

有人可以提供一个例子吗?

4

4 回答 4

653

当您有全局变量时,这很有用。您在头文件中声明全局变量的存在,以便包含头文件的每个源文件都知道它,但您只需要在您的一个源文件中“定义”一次。

澄清一下, usingextern int x;告诉编译器一个int名为的对象x存在某处。知道它存在于哪里不是编译器的工作,它只需要知道类型和名称,这样它就知道如何使用它。编译完所有源文件后,链接器将解析x对它在已编译源文件之一中找到的一个定义的所有引用。为了使它起作用,x变量的定义需要有所谓的“外部链接”,这基本上意味着它需要在函数之外(通常称为“文件范围”)声明并且没有static关键字。

标题:

#ifndef HEADER_H
#define HEADER_H

// any source file that includes this will be able to use "global_x"
extern int global_x;

void print_global_x();

#endif

来源1:

#include "header.h"

// since global_x still needs to be defined somewhere,
// we define it (for example) in this source file
int global_x;

int main()
{
    //set global_x here:
    global_x = 5;

    print_global_x();
}

来源 2:

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

void print_global_x()
{
    //print global_x here:
    std::cout << global_x << std::endl;
}
于 2012-05-02T21:32:52.277 回答
229

当您在几个模块之间共享一个变量时,它很有用。您在一个模块中定义它,并在其他模块中使用 extern。

例如:

在 file1.cpp 中:

int global_int = 1;

在 file2.cpp 中:

extern int global_int;
//in some function
cout << "global_int = " << global_int;
于 2012-05-02T21:32:44.003 回答
83

这都是关于联动的。

先前的答案提供了关于extern.

但我想补充一点。

你问的是externC++中,而不是在C中,我不知道为什么在 C++ 中没有提到这种情况的extern答案const

在 C++ 中,const变量默认具有内部链接(不像 C)。

所以这种情况会导致链接错误

来源 1:

const int global = 255; //wrong way to make a definition of global const variable in C++

来源 2:

extern const int global; //declaration

它需要是这样的:

来源 1:

extern const int global = 255; //a definition of global const variable in C++

来源 2:

extern const int global; //declaration
于 2016-01-24T06:38:13.470 回答
15

当您想要拥有一个全局变量时,这很有用。您在某个源文件中定义全局变量,并在头文件中将它们声明为 extern,这样任何包含该头文件的文件都将看到相同的全局变量。

于 2012-05-02T21:33:37.623 回答