- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我认为我对命名空间和/或静态变量存在根本性的误解。不过我试过这个测试代码(手打,错别字见谅)
测试.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
的不同变量。 htestNum
并在另一个使用 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/
运行 Tomcat 失败并出现 java.lang.OutOfMemoryError - 与缺少 PermGen 空间相关的错误。 我最近将 Tomcat 更改为以自己的用户(而非 root)运行。
我们有一个表,其中包含数百万行,其中包含 PostGIS 几何图形。我们要执行的查询是:落在边界几何内的最新条目是什么?这个查询的问题是我们经常会有大量的项目匹配边界框(半径大约为 5 公里),然后
我有一个Elasticsearch设置,它将允许用户搜索通配符作为索引。 array:3 [ "index" => "users" "type" => "user" "body" => arra
我创建了一个表,其中每行包含两个按钮,并且两个按钮连接在一起,我想将两个按钮分开。我用过 不起作用,css 也是,这是他们的另一种方式。 我有另一个问题,因为我不想在表格边框内显示操作按钮,而是在靠近
我试图在 jQuery Mobile 中的两个按钮之间留出空白。现实中的布局是这样的: Button 1 Button 2 (Hidden w/ display: none)
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
您好,我对图表应用程序还很陌生。现在我为我的应用程序创建了条形图。当我运行 create bar chart as separate project 时,输出如下所示。 然后当我将条形图与我的应用程序
我在使用 H2 和 GeoDB(内存中,junit)时遇到问题。 另外,使用 Hibernate 5(每个包的最新版本,包括 hibernate-spatial)和 Spring 4。 通过 id 实
我想画一张澳大利亚的 map ,并将每个城市表示为一个点。 然后突出显示人口众多(> 1M)的城市 library(sp) library(maps) data(canada.cities) head
关闭。这个问题是opinion-based .它目前不接受答案。 想改进这个问题?更新问题,以便 editing this post 提供事实和引用来回答它. 6年前关闭。 Improve this
如何保持.txt文件中存在的空格?在.txt文件中,它表示: text :text text1 :text1 text23 :text2 text345 :text3 如果我写这段
以下哪个键最大? 选项 1:16 个数字 [0,9] 选项 2:30 个元音 选项 3:字母表中的 16 个字母 选项 4:32 位 有人可以帮助我,告诉我哪一个是正确的答案以及我们如何计算它吗?我知
在 Unity 3d 中使用 Azure 空间 anchor 来实现在 iOS 和 Android 上部署的室内和室外增强现实体验是否有益? 最佳答案 是的,对于 Azure Spatial Anch
我有一个绝对定位的圆形图像。图像只需占据屏幕宽度的 17%,并且距离顶部 5 个像素。 问题是,当我调整图像大小以占据屏幕宽度的 17% 时,它会这样做,但同时容器会变长。图像本身不会拉伸(stret
我在 Ubuntu 14.04 上使用 Cassandra。从文档中,我可以看到运行命令: nodetool snapshot 创建我的 key 空间的快照。 命令的输出是: nodetool sn
Heroku引入了“私有(private)空间”,是否可以将现有应用迁移到私有(private)空间? https://blog.heroku.com/archives/2015/9/10/herok
是否允许在语义记录中使用非绑定(bind)空格 或其他 HTML 编码字符?我遇到的问题是 ; 字符被软件视为记录的结尾。 例如:假设我有一份婚姻记录,其中包含 2 个结婚者的姓氏、结婚年份以及结
我正在研究“智能 parking ”项目,偶然发现了包含我们真正需要的YouTube视频。我们已经实现了第一部分,即从视频源进行实时透视变换,下一步是将其定义为一组矩形 我基本上需要知道他是如何做到的
我有两个类:Engine 和 Trainset(多个单元),这两个类共享其 ID 空间,其中包含名称和系列 id=- . 这是我的Engine类(它是抽象的,因为有引擎的子类型(DieselEngin
如果有人能帮助我,那就太好了。 我正在尝试使用Java的Split命令,使用空格分割字符串,但问题是,字符串可能没有空格,这意味着它将只是一个简单的顺序(而不是“输入2”将是“退出”) Scanner
我是一名优秀的程序员,十分优秀!