c++ - 如何使用 extern 在 C++ 中的源文件之间共享 globe 变量?

标签 c++

IDE:codeblocks 13.12

----------------main.cpp--------------------

#include<iostream>
using namespace std;

extern const int x;

int main()
{
   cout << x << endl;
}

------------sub.cpp--------------------

extern const int x = 10;

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

E:\NewProject\Test\main.cpp|8|undefined reference to `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 包含到不同的翻译单元(源文件 + 它们的 header )中会导致链接器错误,因为有多个变量的定义。

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

An object declared in namespace scope with a const-qualified type has internal linkage unless it is explicitly declared extern or unless it was previously declared to have external linkage.

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

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

但是,无论出于何种原因,如果您决定要先声明您的变量,然后在项目中有一个定义,您可能已经注意到以下内容仍会生成链接器错误:

// foo.h
extern const int i;

// foo.cc
const int i = 0;

这是因为链接器希望在 foo.h 中找到 i 的定义,而 foo.cc 中的 i 具有内部链接(即它是在该翻译单元之外不可见)链接器不会将这些对象视为相同。

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

or unless it was previously declared to have external linkage.

我们需要做的是告诉编译器 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;
}

关于c++ - 如何使用 extern 在 C++ 中的源文件之间共享 globe 变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28106468/

相关文章:

c++ - 你如何声明一个内联类?

c++ - OpenGL Assimp 导入模型不渲染

java - 如何以编程方式使用 MBR 和 USB 闪存扇区?

c++ - 如何在 Qt Creator 的控制台应用程序中将日志打印到文件中?

c++ - 无缘无故地在我的 C++ 指针代码中不断出现错误

c++ - 在 vector.push_back() 导致重新分配后如何让 vector 迭代器指向 vector ?

java - 更改 shared_ptr 的 getCPtr() 可见性

c++ - 如何设置 Makefile 以使用 Visual-Studio 风格的输出目录进行构建?

c++ - 套接字上的FTP写入错误的文件和不同大小的C++

c++ - 如何检查存储为字符串的数字( double 类型)是否是 C++ 中的有效 double ?