如何正确使用外部变量

How to use extern variable correctly?

本文关键字:外部 变量 何正确      更新时间:2023-10-16

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是一个整数变量,所以你可以更改它的值。