0

据我了解,您在 .cpp 文件中而不是在 .h 中初始化静态成员的原因是,获取该成员的多个实例是没有风险的。然后以这个例子为例:

   //Foo.h
   #ifndef FOO_H
   #define FOO_H

   class Foo{
      static int a;

   }; 
   int Foo::a = 95; 
   #endif

预处理器指令确保这个 .h 文件只编译一次,从而确保静态成员只有一个实例。是否可以这样做而不是在 .cpp 文件中启动静态成员?

4

4 回答 4

7

不,它只保证Foo.h每个编译单元(.cpp文件)包含一次。不在整个项目中。您应该在其中定义静态成员Foo.cpp

于 2012-07-06T11:05:44.147 回答
4

考虑有两个源代码文件a.cppb.cpp,它们都包含标头。由于它们是相互独立编译的,因此标头保护不起作用,您最终将得到两个目标文件a.ob.o并且定义了Foo:a. 试图将它们联系在一起会失败。

于 2012-07-06T11:07:10.950 回答
3

如果标头包含在多个.cpp文件(翻译单元)中,这将导致链接器错误:

//a.cpp
#include <Foo.h>

//b.cpp
#include <Foo.h>

编译后,a.obj包含 的定义Foo::ab.obj包含 的定义Foo::b。如果尝试将这两个.obj文件链接到单个二进制文件中,则会发生多重定义错误。

于 2012-07-06T11:05:45.440 回答
1

不,包含保护确保每个编译单元最多包含一次标头。如果你的程序有多个编译单元(.cpp文件),包括头文件,那么你最终会得到多个Foo::a.

于 2012-07-06T11:06:42.587 回答