全局静态指针问题

时间:2010-08-07 18:43:00

标签: visual-c++ visual-studio-2010 variables pointers

从复杂的情况来看,这是一个相当大的问题。我有一个静态指针坐在我的一个头文件中。哪个被包含在各处,这就是我把它作为静态指针的原因。这样我就可以在main函数中快速初始化它,以便其他文件可以使用它。

问题在于,即使在我初始化并将内容放入其中之后。其他文件只能找到NULL。就像包含带有静态指针的头文件的每个文件都为自己创建一个副本,即使其他人初始化它,每个文件都有自己独立的副本。否定当然,有一个全局变量的目的。

我该如何应对?也许我理解一个静态变量错误,或者可能是因为它是一个指针?

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

3 个答案:

答案 0 :(得分:12)

  

就像包含带有静态指针的标头的每个文件都为自己创建一个副本,即使其他文件初始化它,每个文件都有自己独立的副本。

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

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

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

答案 1 :(得分:7)

是的,您了解static关键字错误。命名空间和文件范围内的静态关键字声明了一个变量,该变量仅在声明它的转换单元(基本上是单个.cpp文件及其所有包含)中可见。通过在多个.cpp文件中使用的标头中声明一个静态变量,您可以有效地定义多个变量。

如果你想要一个全局指针,那么在单个头中声明它extern而没有static,并在单个.cpp文件中定义它而不需要externstatic。 E.g:

在foo.h中:

extern int * p;

并在main.cpp中:

int * p = something;

答案 2 :(得分:1)

定义全局指针static会导致C ++编译器为每个翻译单元创建一个单独的指针,该定义包含在内。我很确定这不是你想要的,而是你问题的原因。

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

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

顺便说一下。如果您确实希望变量仅在一个翻译单元中可见,建议的方法是将ii放入匿名名称空间。 static也可以使用,但不推荐使用它。