如何使用 extern 在 C++ 中的源文件之间共享地球变量
How can I use extern to share globe variables between source files in C++?
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;
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- int(c) 和 c-'0' 之间的区别。C++
- 在cuda线程之间共享大量常量数据
- 在c代码之间共享数据的最佳方式
- Mix_Init和Mix_OpenAudio SDL之间的区别是什么
- C++ 使用 assign 函数的字符串与直接使用 '=' 更改值的字符串之间的区别
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- std::atomic和std::condition_variable wait,notify_*方法之间的区别
- 大小相等但成员数量不同的结构之间的性能差异
- 类与私有变量的其他类之间的线程安全性
- C++两个源文件之间共享的枚举的静态实例
- 我应该在源文件之间共享的常量的定义中添加关键字"extern"吗
- 如何在GLFW 3中的源文件之间共享窗口上下文
- 在 C# 和 C++ 之间共享源文件
- 如何使用 extern 在 C++ 中的源文件之间共享地球变量
- 2个c源文件之间的函数指针操作导致编译时错误
- 在c/c++中,在源文件之间共享变量的最佳策略是什么
- 在项目之间共享源文件
- c++在两个.cpp源文件之间传递动态变量
- 两个源文件之间的变量(类和全局)