从复杂的情况来看,这是一个相当大的问题。我有一个静态指针坐在我的一个头文件中。哪个被包含在各处,这就是我把它作为静态指针的原因。这样我就可以在main函数中快速初始化它,以便其他文件可以使用它。
问题在于,即使在我初始化并将内容放入其中之后。其他文件只能找到NULL。就像包含带有静态指针的头文件的每个文件都为自己创建一个副本,即使其他人初始化它,每个文件都有自己独立的副本。否定当然,有一个全局变量的目的。
我该如何应对?也许我理解一个静态变量错误,或者可能是因为它是一个指针?
我应该将其声明为:& variable = 5;或者只是变量= 5;或& variable =(int)5?
答案 0 :(得分:12)
就像包含带有静态指针的标头的每个文件都为自己创建一个副本,即使其他文件初始化它,每个文件都有自己独立的副本。
这是static
在命名空间范围内应用于变量时的含义:变量被赋予内部链接,使其成为给定翻译单元(源文件)的“本地”。
如果头文件中的命名空间范围内有static
变量,并且您将该头文件包含在多个.cpp文件中,则该变量将有多个实例:每个.cpp文件一个包括头文件。
如果您想要一个跨多个源文件共享的全局变量,则需要将其设为extern
。在头文件中将变量声明为extern,然后在一个.cpp文件中定义extern变量。
答案 1 :(得分:7)
是的,您了解static
关键字错误。命名空间和文件范围内的静态关键字声明了一个变量,该变量仅在声明它的转换单元(基本上是单个.cpp文件及其所有包含)中可见。通过在多个.cpp文件中使用的标头中声明一个静态变量,您可以有效地定义多个变量。
如果你想要一个全局指针,那么在单个头中声明它extern
而没有static
,并在单个.cpp文件中定义它而不需要extern
或static
。 E.g:
在foo.h中:
extern int * p;
并在main.cpp中:
int * p = something;
答案 2 :(得分:1)
定义全局指针static
会导致C ++编译器为每个翻译单元创建一个单独的指针,该定义包含在内。我很确定这不是你想要的,而是你问题的原因。
您应该在标头中声明它extern
并在一个cpp文件中定义一次。
我可以想象混淆来自static
关键字在class
或struct
定义中的作用。实际上,它在那里的工作方式不同,它创建了一个变量,对class
或struct
的所有实例都是通用的。
顺便说一下。如果您确实希望变量仅在一个翻译单元中可见,建议的方法是将ii放入匿名名称空间。 static
也可以使用,但不推荐使用它。