Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使用extern在C+;中的源文件之间共享全局变量+;?_C++ - Fatal编程技术网

C++ 如何使用extern在C+;中的源文件之间共享全局变量+;?

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文件都包含这个头文件。但它没有用) 如果我想在

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文件都包含这个头文件。但它没有用)

如果我想在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];

cout
extern
意味着您的变量只是在这里声明的,但在另一个转换单元中定义的。因此,您可以对常量
extern const int x;
进行多次声明,但必须在
sub.cpp
make
const int x=10中对该常量有一个定义(不要在实际定义变量的位置添加
extern
)。将您的extern声明放入头文件,并从sub.cpp中删除extern。#RTFMbtw我要祝贺您,并感谢您花时间和精力正确地提出您的第一个问题。第一个问题看起来如此正常的情况非常罕见。欢迎使用Stack Overflow!