我知道这会有一个简单的答案,但我很难过。我尽可能地简化了代码以达到目的。
我有一个简单的头文件,称之为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);
}
唉,所有打印的都是“Some Girls Say”。是什么赋予了?我不明白settings :: name是如何不存活B :: doSomething()的功能破坏(我只能猜测这是问题)。 strcpy是懒惰的,只是将settings :: name指向“I Like Dogs”的开头,而不是实际上像strdup一样?
非常感谢任何帮助和解决方法。谢谢!
编辑:为了进一步说明,在C.printSomething()之前调用B.doSomething()。
答案 0 :(得分:7)
static
关键字将name
链接到其包含的每个翻译单元中,因此每个.cpp文件基本上都有自己的name
版本。
您要做的是将要共享的name
放在一个.cpp文件中(不带static
,并在.h文件中用extern
链接声明它。< / p>
这样:
namespace settings {
char name[16] = { 0 };
}
namespace settings {
extern char name[16];
}
void B::doSomething()
{
strcpy(settings::name,"I like Dogs");
}
#include "a.h"
void C::printSomething()
{
printf("Some Girls Say %s\n",settings::name);
}
答案 1 :(得分:1)
通过在两个源文件中包含该标头,您有两个单独的存储位置。包括标题有点像将代码粘贴到源文件中。所以他们每个都有自己的静态变量'name'。
要让它做你想做的事,你需要:
答案 2 :(得分:0)
首先在a.cpp中写道
namespace settings{
char name[16];
}
然后确保
B::doSomething()
被召唤。