如何使用 extern 在 C++ 中的源文件之间共享地球变量

How can I use extern to share globe variables between source files in C++?

本文关键字:之间 源文件 共享 地球 变量 何使用 extern C++      更新时间:2023-10-16

IDE:codeblocks 13.12

--------------主要.cpp------------------

#include<iostream>
using namespace std;
extern const int x;
int main()
{
   cout << x << endl;
}

--------------子.cpp-------------------

extern const int x = 10;

当我尝试运行之前的代码时,编译器显示错误:

E:\NewProject\Test\main.cpp|8|对"x"的未定义引用|

那么,谁能告诉我如何解决这个问题呢?(我尝试创建一个头文件,就像:

extern const int x;

并让两个 cpp 文件都包含此头文件。但它没有用)

如果我想在 main 创建一个数组.cpp就像:

int _array[x];

我该怎么办?

我是新来的,英语不好。非常感谢!!

extern关键字表示:这只是一个声明。

对于一个变量,你只需要一个定义,即一个没有extern其他地方的声明:

// foo.h
extern int i;
// foo.cc
#include "foo.h"
int i;   // definition
// bar.cc
#include "foo.h"
int main () {
  ++i;   // modifies global variable
}

const的特殊规则

const变量的一个常见用例是在头文件中定义常量,然后在程序的其他位置使用它们:

// my_constants.h
const int NumHoursInDay = 24;
const int NumMinutesInHour = 60;

如果不const这些变量,则my_constants.h包含到不同的翻译单元(源文件+它们的标头)中将导致链接器错误,因为变量有多个定义。

标准委员会决定这将是一个足够常见的用例,他们实际上为声明const的变量制定了一个特殊的规则,C++ '03 7.1.5/2:

在命名空间范围内声明的具有 const 限定类型的对象具有 内部链接,除非明确声明为外部链接或除非它是 先前声明有外部联系。

这意味着每个翻译单元都有自己的 const 变量的私有副本。 链接器不会尝试将它们合并在一起,因此不会出现错误。

所以第一点是,您实际上只需从示例中删除extern,您的代码就会正确编译和链接,这一切都是因为 const 的这种特殊行为。

但是,无论

出于何种原因,如果您决定首先声明变量,然后在项目中具有单个定义,您可能已经注意到以下内容仍将生成链接器错误:

// foo.h
extern const int i;
// foo.cc
const int i = 0;

这是因为链接器希望在 foo.h 中找到i的定义,并且由于 foo.cc 中的i具有内部链接(即,在该转换单元之外不可见),链接器不会认为这些对象是相同的。

这可以通过查看标准引用的末尾来解决:

或者除非事先宣布具有外部联系。

我们需要做的是告诉编译器,foo.cc 中的i应该具有外部链接,方法是首先用extern声明它,然后在没有extern的情况下定义它。

// foo.cc
extern const int i;
const int i = 0;

最好的方法是包含我们的头文件,以便我们只有一个声明:

// foo.cc
#include "foo.h"   // contains the extern declaration of 'i'
const int i = 0;

数组维度

最后一点是数组维度需要是一个常量表达式。 更令人困惑的是,当前翻译单元中未定义的extern const变量不被视为常量表达式

extern const int ArrayDim;
int array[ArrayDim];       // Illegal C++

代码可以编译,特别是如果你使用的是 g++,因为有一个称为可变长度数组的 C 语言功能。 在后台,编译器隐藏了内存分配以支持这一点。

由于您打算在多个翻译单元中使用常量,并且需要将其用作常量表达式,因此最好的选择是在头文件中定义常量:

// my_constants.h
const int x = 10;

#include<iostream>
#include "my_constants.h"
using namespace std;
int main()
{
   int _array[x];
   cout << x << endl;
}

extern表示您的变量只是在这里声明,但在另一个翻译单元中定义。因此,你可以有很多常数extern const int x;的声明,但你必须对这个常量只有一个定义const int x = 10;

sub.cpp中,只需使用

const int x = 10;