类C++的静态函数成员中的静态数据成员初始化顺序
Static data member in static function member of class C++ order of initialisation
我有一个宏,用来向注册表映射添加键和值。(假设AddToMap位于全局静态对象上,该对象在其他位置定义。)在定义了不同的类(类的某种注册表)后,AddKey宏在代码中的不同位置被调用。代码被划分为许多具有复杂依赖性的.h和.cc文件。
我有以下一段代码可以工作:
#define AddKey(key, val)
namespace NSP_##key {
class A {
public:
static bool foo() {
static bool dummy = AddToMap(#key, #val);
}
};
static bool dummy_A = A::foo();
}
`
我想知道静态变量dummy是如何创建和初始化的。当我使用GDB时,我看到这个A::add在main或其他任何东西被调用之前就被调用了。这是静态变量所期望的。
然而,如果我从类更改为函数,那么代码似乎不再工作,并抱怨"密钥已经添加"
#define AddKey(key, val)
namespace NS_##key {
static bool A_foo() {
static bool dummy = AddToMap(#key, #val);
}
static bool dummy_A = A_foo();
}
我理解dummy_A必须是静态的,因为C++中有一个定义规则,A_foo()也是如此。但是,为什么静态变量dummy在静态函数中的行为与在类的静态成员中的行为不同呢?
在类中,static
关键字不影响链接,但意味着它独立于类对象。无论有多少次AddKey(MyClass, hello)
,都只有一个函数NSP_MyClass::A::foo()
,它只调用AddToMap
一次。
在类或函数之外,static
关键字提供了一个名称内部链接,这意味着包含它的每个编译单元都有自己的名称版本。因此,在第二个示例中,对于包含AddKey(MyClass, hello)
的每个*.cc文件,都有一个名为NS_MyClass::A_foo()
的不同函数。这些函数中的每一个都将尝试调用AddToMap
一次,从而产生冲突问题。
使用inline
而不是static
在头文件中有一个函数定义,但每次都是相同的函数:
#define AddKey(key, val)
namespace NS_##key {
inline bool A_foo() {
static bool dummy = AddToMap(#key, #val);
}
static bool dummy_A = A_foo();
}
相关文章:
- 类定义中的静态数据成员初始化
- 为什么在静态数据成员初始化器中未完全定义类
- 重载放置新运算符,具有数据成员初始化以及与普通新运算符的差异
- 模板非静态数据成员初始化程序何时实例化
- C++静态数据成员初始化
- 使用初始化列表时的 C++ 数据成员初始化顺序
- Cocos2d-x AppDelegate数据成员初始化丢失
- 基类构造函数和数据成员初始化的奇怪行为
- Visual Studio 2013 因非静态数据成员初始化而崩溃
- std::vector的非静态数据成员初始化器/调用构造函数
- GCC 默认 int 数据成员初始化
- 何时在C++中使用哪个数据成员初始化
- Clang++ 非静态数据成员初始化错误?C++11.
- C++11;非静态数据成员初始化是否可以访问其他数据成员
- 类C++的静态函数成员中的静态数据成员初始化顺序
- C++警告非静态数据成员初始化程序
- 抱歉,未实现:c++ 11中的非静态数据成员初始化器
- c++ RPG错误:不允许使用数据成员初始化式
- 静态数据成员初始化顺序
- 在c++ 0x中,非静态数据成员初始化式是否覆盖隐式复制构造函数?