我知道这会有一个简单的答案,但我很难过.我尽可能地简化了代码以达到目的.
我有一个简单的头文件,调用它啊
它具有以下内容而已(仅适用于我项目中选择包含它的所有文件的全局设置文件)
#ifndef A_H
#define A_H
namespace settings{
static char name[16]={'\0'};
}
#endif
Run Code Online (Sandbox Code Playgroud)
然后我有另一个类,有自己的头文件,我们称之为b.cpp(bh未显示)
#include "a.h"
void B::doSomething()
{
strcpy(settings::name,"I like Dogs");
}
Run Code Online (Sandbox Code Playgroud)
最后,访问'settings :: name的第三个类,称之为c.cpp(ch未显示)
#include "a.h"
void C::printSomething()
{
printf("Some Girls Say %s\n",settings::name);
}
Run Code Online (Sandbox Code Playgroud)
唉,所有打印的都是"Some Girls Say".是什么赋予了?我不明白settings :: name是如何不存活B :: doSomething()的功能破坏(我只能猜测这是问题).strcpy是懒惰的,只是将settings :: name指向"I Like Dogs"开始而不是实际上像strdup一样?
非常感谢任何帮助和解决方法.谢谢!
编辑:为了进一步清晰,在C.printSomething()之前调用B.doSomething().
该static关键字链接name到它包含在每个翻译单元,所以每个.cpp文件基本上都有自己的版本name.
你想要做的是把name你想要共享的.cpp文件(没有static和extern.在.h文件中用链接声明它).
所以那是:
namespace settings {
char name[16] = { 0 };
}
Run Code Online (Sandbox Code Playgroud)
namespace settings {
extern char name[16];
}
Run Code Online (Sandbox Code Playgroud)
void B::doSomething()
{
strcpy(settings::name,"I like Dogs");
}
Run Code Online (Sandbox Code Playgroud)
#include "a.h"
void C::printSomething()
{
printf("Some Girls Say %s\n",settings::name);
}
Run Code Online (Sandbox Code Playgroud)