static char数组在类之间意外地表现

时间:2011-04-14 19:59:13

标签: c++ pointers

我知道这会有一个简单的答案,但我很难过。我尽可能地简化了代码以达到目的。

我有一个简单的头文件,称之为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()。

3 个答案:

答案 0 :(得分:7)

static关键字将name链接到其包含的每个翻译单元中,因此每个.cpp文件基本上都有自己的name版本。

您要做的是将要共享的name放在一个.cpp文件中(不带static,并在.h文件中用extern链接声明它。< / p>

这样:

a.cpp

namespace settings {
    char name[16] = { 0 };
}

A.H

namespace settings {
    extern char name[16];
}

b.cpp

void B::doSomething()
{
    strcpy(settings::name,"I like Dogs");
}

c.cpp

#include "a.h"

void C::printSomething()
{
    printf("Some Girls Say %s\n",settings::name);
}

答案 1 :(得分:1)

通过在两个源文件中包含该标头,您有两个单独的存储位置。包括标题有点像将代码粘贴到源文件中。所以他们每个都有自己的静态变量'name'。

要让它做你想做的事,你需要:

  • 在标题中使用extern,而不是静态。这实际上意味着包含标题的每个文件都希望引用它外部的变量。
  • 在您的某个源文件中定义变量。它需要在某处定义一次。定义时不要使用static或extern。

答案 2 :(得分:0)

首先在a.cpp中写道

namespace settings{
   char name[16];
}

然后确保

B::doSomething()

被召唤。