2010-08-07 58 views
2

这是一个相当复杂的情况。我有一个静态指针坐在我的一个头文件中。无处不在,这就是为什么我把它作为一个静态指针。所以我可以在我的主函数中快速初始化它,以便其他文件可以使用它。全局静态指针问题

问题是这样的,即使在我初始化它并将东西放入它之后。其他文件只能找到NULL。就像每个包含带有静态指针的头文件的文件都为它自己创建一个副本,甚至当其他人初始化它时,每个文件都有自己的独立副本。否定性目标,即具有全局变量的目的。

我该如何处理这个问题?也许我正在理解一个静态变量错误,或者是因为它的指针?

我应该声明它为:& variable = 5;或者只是变量= 5;或者& variable =(int)5?

回答

12

就像每个包含带有静态指针的头文件的文件都为其自身创建一个副本,甚至当其他人初始化它时,每个文件都有自己的独立副本。

这就是static在命名空间范围应用于变量时的含义:变量被赋予内部链接,使其对给定的翻译单元(源文件)是“本地”。

如果在头文件的命名空间范围内有一个static变量,并且将该头文件包含在多个.cpp文件中,则会有多个该变量的实例:每个包含头文件的.cpp文件一个文件。

如果你想要一个跨多个源文件共享的全局变量,你需要使它变成extern。在头文件中声明变量为extern,然后在您的.cpp文件中定义extern变量。

+0

您与wilx一起回答是正是我需要的。谢谢你,先生 – Overseer10 2010-08-07 19:14:08

1

定义全局指针static会导致C++编译器为每个翻译单元创建一个单独的指针,该定义包含在其中。我敢肯定,这不是您想要的,而是您遇到问题的原因。

您应该在头文件中声明它extern并在一个cpp文件中定义一次。

我可以想象,混淆来自于,static关键字在classstruct定义。事实上,它在那里的工作方式不同,它会创建一个变量,通用于所有classstruct的实例。

Btw。如果你真的想要一个变量只在一个翻译单元中可见,推荐的方法是将ii放入一个匿名名称空间中。 static也适用,但不推荐使用它。

7

是的,你正在理解关键字static错误。名称空间和文件范围中的静态关键字声明一个变量,该变量仅在翻译单元(基本上是单个.cpp文件及其所有包含文件)内部可见的地方声明。通过在头文件中声明一个用于多个.cpp文件的静态变量,可以有效地定义多个变量。

如果你想有一个全局指针,然后在单头声明它没有externstatic在一个.cpp文件中定义它没有externstatic。例如: -

foo.h中:

extern int * p; 

和main.cpp中:

int * p = something;