gpt4 book ai didi

c++ - 如何在命名空间中使用变量

转载 作者:可可西里 更新时间:2023-11-01 14:54:35 26 4
gpt4 key购买 nike

我认为我对命名空间和/或静态变量存在根本性的误解。不过我试过这个测试代码(手打,错别字见谅)

测试.h:

namespace test{
static int testNum=5;
void setNum(int value);
}

主要.cpp:

#include <test.h>

int test::setNum(int value){
testNum=value;
}

int main(){
test::setNum(9);
cout<<test::testNum;
}

当我运行它时,我得到的值是 5,而不是我预期的 9。似乎我有两个 testNum 变量实例,但这似乎与 static 应该做的完全相反。我猜我错误地假设这些特性在某种程度上与它们的 Java 等价物相同......

如果我从我的 testNum 声明中删除静态,我还会收到一条错误消息,指出 testNum 被多次声明,有人可以解释为什么会这样吗?

谢谢

最佳答案

首先,您的误解与 namespace 无关,只是关于static。对于这个答案的其余部分,我将简单地引用 testNum 因为它在命名空间中的事实是无关紧要的。

我还假设您有另一个文件,可能称为 test.cpp,其中还包含 test.h 并定义了 setNum功能。

当命名空间范围内的变量或函数(即不是类成员或函数的局部变量)被声明为 static 时,这意味着实体的名称是该文件的内部名称。形式上它具有“内部链接”,这意味着它不能通过名称引用或从其他文件链接到(它可以通过指针间接引用或将其作为参数传递给另一个函数。)这意味着如果有几个文件定义 static int testNum 然后每个文件都有自己的同名内部变量,与每个其他文件中的 testNum 不同(事实上,一个文件可以有 static int testnum 和另一个可以有 static double testnum 和另一个 static char* testNum,它们都是不同的并且在每个文件内部。)如果你把一个类似于 header 中的定义,然后每个包含 header 的文件都有自己的 testNum

因此,在 header 中的变量上使用 static,您在每个包含 test 的文件中都有一个名为 testNum不同变量。 h.这意味着如果您在一个文件中设置 testNum 并在另一个使用 testNum 的文件中调用一个函数,它指的是一个不同的变量,它只是碰巧同名。

因此,在 header 中声明非 const static 变量几乎总是错误的。

如果没有 static,您将在每个包含 test.h 的文件中定义 testNum 变量,这是不允许的:每个实体必须在您的程序中定义一次且仅一次。解决这个问题的方法是在 header 中声明变量,而不是定义它,您可以通过告诉编译器变量是extern:

extern int testNum;  // N.B. no "= 1" here

这告诉编译器有一个名为 testNum 的具有“外部链接”的变量,因此当代码引用 testNum 时,它总是表示相同的变量(不是某个名称具有内部链接,在每个文件中都是不同的实体。)在声明 extern 变量后,您有责任确保在程序某处提供了一个定义,因此在exactly one 文件(即不在包含在多个文件中的 header 中)您定义它:

int testNum = 1;

关于c++ - 如何在命名空间中使用变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11478152/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com