问题描述
我知道这将是一个简单的答案,但很困难。我已经尽可能地简化了代码,以使事情变得很有意义。
我有一个简单的头文件,称为a.h
其中包含以下内容(仅作为我项目中所有要包含此文件的文件的全局设置文件)
#ifndef A_H
#define A_H
namespace settings{
static char name[16]={\'\\0\'};
}
#endif
然后,我有另一个类,带有其自己的头文件,让我们将其称为b.cpp(未显示b.h)
#include \"a.h\"
void B::doSomething()
{
strcpy(settings::name,\"I like Dogs\");
}
最后,访问“ settings :: name”的第三类称为c.cpp(未显示c.h)
#include \"a.h\"
void C::printSomething()
{
printf(\"Some Girls Say %s\\n\",settings::name);
}
las,所有被打印出来的就是“有些女孩说”。是什么赋予了?我不明白settings :: name不能在B :: doSomething()的函数销毁后幸存下来(我只能猜这是问题所在)。是strcpy懒惰,只是将settings :: name指向\“ I Like Dogs \”开始的地方,而不是像strdup那样实际工作吗?
任何帮助和解决方法都非常感谢。谢谢!
编辑:为进一步清楚起见,在C.printSomething()之前调用B.doSomething()。
解决方法
static
关键字将name
链接到它所包含的每个翻译单元中,因此每个.cpp文件基本上都有自己的version4ѭ版本。
您要执行的操作是将要共享的ѭ4放入一个.cpp文件中(不包含static
,并在.h文件中使用extern
链接进行声明。
所以那是:
cpp文件
namespace settings {
char name[16] = { 0 };
}
啊
namespace settings {
extern char name[16];
}
b.cpp
void B::doSomething()
{
strcpy(settings::name,\"I like Dogs\");
}
cpp文件
#include \"a.h\"
void C::printSomething()
{
printf(\"Some Girls Say %s\\n\",settings::name);
}
,通过将该标头包含在两个源文件中,您将拥有两个单独的存储位置。包括头文件有点像只是将代码粘贴到源文件中。因此,它们每个都有自己的静态变量,称为\'name \'。
要使此功能执行您想要的操作,您需要:
在标题中使用extern,而不是静态的。这实际上意味着包括头文件在内的每个文件都希望引用其外部的变量。
在一个源文件中定义变量。需要一次在某处定义它。定义它时不要使用static或extern。
,首先写在a.cpp中
namespace settings{
char name[16];
}
然后确保
B::doSomething()
叫做。