何时在C ++中使用extern

问题描述 投票:347回答:5

我正在阅读“用C ++思考”,它刚刚介绍了extern声明。例如:

extern int x;
extern float y;

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

有人能提供一个例子吗?

c++ variable-declaration
5个回答
464
投票

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

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

header:

#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

source 1:

#include "header.h"

// it needs to be defined somewhere
int global_x;

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

    print_global_x();
}

source 2:

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

void print_global_x()
{
    //print global_x here:
    std::cout << global_x << std::endl;
}

140
投票

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

例如:

在file1.cpp中:

int global_int = 1;

在file2.cpp中:

extern int global_int;
//in some function
cout << "global_int = " << global_int;

57
投票

这完全取决于联系。

以前的答案为qazxsw poi提供了很好的解释。

但我想补充一点。

你问C ++中的extern不是用C语言,我不知道为什么当extern在C ++中附带extern时没有回答这个问题的答案。

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

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

来源1:

const

来源2:

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

它必须是这样的:

来源1:

extern const int global; //declaration

来源2:

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

13
投票

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


0
投票

当你有全局变量时,你必须在任何未定义的翻译单元中将它们声明为extern,否则你将获得多个定义。这当然是要避免的,因为全局变量通常都不好。

当您使用C语言编写并希望允许C ++用户使用您的库时,您可以在extern const int global; //declaration 块中声明您的内容。由于C糟透了,你也不应该这样做。

最后,声明一个模板实例化发生在其他地方,你想要链接到它而不是创建一个新的。你也宣布那些extern。偶尔使用......也许......我从来没有。

我想我可以一方面计算我在C ++中需要“extern”的次数,因为我倾向于避免使用它所需的所有结构。

© www.soinside.com 2019 - 2024. All rights reserved.