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/