如何正确使用外部变量
How to use extern variable correctly?
Q1:我最近读了C++ Primer
本书,当我读到以下:
我若要替换变量的值,编译器必须查看变量的初始值设定项。当我们将程序拆分为多个文件时,每个使用 const 的文件都必须有权访问其初始值设定项。为了查看初始值设定项,必须在每个想要使用该变量值的文件中定义变量。
有一个问题:当我使用其他文件中定义的变量时,我只需使用 extern
声明就足够了,为什么要must have access to its initializer
,所以我做了一个测试:
在主要.cpp中,我在下面写:
#include <iostream>
using namespace std;
extern int test;
int main()
{
cout << test << endl;
return 0;
}
在测试.cpp中,我在下面写道:
int test = 100;
顺便说一下,这两个文件被添加到同一个项目中,否则它将无法成功构建。当我运行它们时,它会打印
100
就像我所期望的那样。但总的来说.cpp,我不需要像书中所说的那样定义int test = 100
的东西。我不知道谁是对的。
问2:
int i = 43;
const int &r = i;
i = 1; //when i changed, r alse changed
我已经在gcc 4.7和Visual Studio 2013中进行了测试,它们都得到了相同的结果,r 已更改。那么,const
的意义何在?r不应该总是43吗?
我认为书中的引文的意思如下
const size_t N = 10;
int main()
{
int a[N];
//...
}
如果常量 N 是在带有说明符 extern
的其他模块中定义的,则在带有 main 的模块中,编译器无法访问常量的值,因此无法定义数组
extern const size_t N;
int main()
{
int a[N]; // error: the value N is unknown
//...
}
由于这个原因,常量具有内部链接,可以在编译时需要其值的每个模块中定义它们。
至于第二个问题,则使用常量引用来防止使用引用修改引用的对象。
例如,如果您希望某个函数不会更改复合对象,则可以将其参数声明为对该对象的常量引用。
此外,临时对象绑定到常量引用。
考虑一个例子
void display_string( const std::string &s )
{
std::cout << s << std::endl;
}
您可以使用字符数组调用该函数。例如
display_string( "Hello, World" );
编译器将字符串文本隐式转换为类型 std::string
的临时对象,并将其绑定到参数的常量引用。
如果参数不会像常量引用那样声明,例如
void display_string( std::string &s );
然后编译器将发出错误。
使用常量引用,假定客户端代码不会更改引用的对象本身。
也就是说,客户端代码可以查看对象,但不能用手触摸它:)
Q1。 have access to its initializer
意味着编译器需要知道变量的初始值设定项(定义(。你可以让编译器通过链接 main 来实现这一点.cpp并一起测试.cpp。你说these two files are added in the same projects
,所以IDE会为你做这件事。您可以在此问题上找到更多信息。
问题 2.编译器不允许你更改r
的值,因为它是对 const 变量的引用,但i
是一个整数变量,所以你可以更改它的值。
- 如果全局变量默认是外部变量,为什么要添加"extern"关键字?
- 堆栈/帧指针作为外部变量
- const_cast const 方法中的"this"将"this"分配给外部变量?
- 外部变量的初始化
- 如何在命名空间中初始化外部变量
- 将全局外部变量的私有版本与 OpenMP 结合使用
- 使用外部变量会导致"unsigned char"错误LNK2001
- 为什么通过复制捕获 lambda 具有与外部变量相同的地址
- 我们是否应该在项目中包含的所有文件中声明外部变量
- 如何将 Wifi.localIP() 转换为字符串并将其存储到外部变量
- 具有仅在某些情况下引用外部变量的属性的类
- C 中的外部变量
- Xcode C++外部变量链接器错误
- 使用外部变量时的多重定义错误
- C 和 C++ 中的外部变量有什么区别
- 默认情况下,非常量变量不被视为外部变量吗?
- 当外部变量在其他文件中声明不同时,如何使G 产生警告
- 是初始化为其默认值的外部变量
- 将外部变量传递给类 c++
- C++中有更多的类和外部变量