C++ 如何使用extern在C+;中的源文件之间共享全局变量+;?
IDE:代码块13.12 --------------main.cpp------------------C++ 如何使用extern在C+;中的源文件之间共享全局变量+;?,c++,C++,IDE:代码块13.12 --------------main.cpp------------------ extern const int x = 10; 当我尝试运行之前的代码时,编译器显示错误: E:\NewProject\Test\main.cpp | 8 |对“x”的未定义引用| 那么,谁能告诉我如何解决这个问题呢? (我尝试创建一个头文件,如下所示: extern const int x; int _array[x]; 让两个cpp文件都包含这个头文件。但它没有用) 如果我想在
extern const int x = 10;
当我尝试运行之前的代码时,编译器显示错误:
E:\NewProject\Test\main.cpp | 8 |对“x”的未定义引用|
那么,谁能告诉我如何解决这个问题呢?
(我尝试创建一个头文件,如下所示:
extern const int x;
int _array[x];
让两个cpp文件都包含这个头文件。但它没有用)
如果我想在main.cpp创建一个数组,就像:
extern const int x;
int _array[x];
我该怎么办
我是新来的,英语不好。
非常感谢 在
sub.cpp
中,只需使用
const int x = 10;
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
变量的一个常见用例是在头文件中定义常量,然后在程序中的任何其他地方使用它们:
// my_constants.h
const int NumHoursInDay = 24;
const int NumMinutesInHour = 60;
如果这些变量不是const
,那么将my_constants.h
包含到不同的翻译单元(源文件+它们的头)中会由于变量的多个定义而导致链接器错误
标准委员会认为这将是一个常见的用例,他们实际上为变量声明了一个特殊的规则,声明为代码> const ,C++ 03 7.1.5/2:< /p> 命名空间范围中声明的具有常量限定类型的对象已 内部链接,除非它显式声明为extern或 以前声明具有外部链接
这意味着每个翻译单元都有自己的const
变量的私有副本。链接器不会尝试将它们合并在一起,因此不会出现错误
因此,第一点是,实际上您可以从Exmaple中删除extern
,您的代码将正确编译和链接,这都是因为const
的这种特殊行为
但是,无论出于何种原因,如果您决定先声明变量,然后在项目中使用单个定义,那么您可能已经注意到以下情况仍然会生成链接器错误:
// foo.h
extern const int i;
// foo.cc
const int i = 0;
这是因为链接器希望在Fo.h中找到<代码> i <代码>的定义,并且在.Fo..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
变量不被视为常量表达式:
代码可能会编译,尤其是在使用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;
}
//my_constants.h
常数int x=10;
#包括
#包括“my_constants.h”
使用名称空间std;
int main()
{
int_数组[x];
coutextern
意味着您的变量只是在这里声明的,但在另一个转换单元中定义的。因此,您可以对常量extern const int x;
进行多次声明,但必须在sub.cpp
makeconst int x=10中对该常量有一个定义(不要在实际定义变量的位置添加extern
)。将您的extern声明放入头文件,并从sub.cpp中删除extern。#RTFMbtw我要祝贺您,并感谢您花时间和精力正确地提出您的第一个问题。第一个问题看起来如此正常的情况非常罕见。欢迎使用Stack Overflow!