C++ 类的静态函数成员中的静态数据成员++;初始化顺序

C++ 类的静态函数成员中的静态数据成员++;初始化顺序,c++,static-methods,static-members,C++,Static Methods,Static Members,我有一个宏,我用它向注册表映射添加键、值。(假设AddToMap位于全局静态对象上,该对象在其他地方定义。) 定义不同的类(类的某种注册表)后,在代码中的不同位置调用AddKey宏。代码被划分为许多具有复杂依赖性的.h和.cc文件 我有以下一段代码可以工作: #define AddKey(key, val)\ namespace NSP_##key {\ class A {\ public:\ static bool foo() {\ static boo

我有一个宏,我用它向注册表映射添加键、值。(假设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或其他任何东西之前就被调用了。这是静态变量的预期结果

但是,如果我从一个类更改为一个函数,那么代码似乎不再工作,并抱怨“已经添加了密钥”


<> P>我知道,由于C++中的一个定义规则和AyFoE()的相同原因,DimyMyA必须是静态的。但为什么静态变量dummy在静态函数中的行为与在类的静态成员中的行为不同?

在类中,
static
关键字不影响链接,但意味着它独立于类对象。无论您有多少次
AddKey(MyClass,hello)
,只有一个函数
NSP\u MyClass::A::foo()
,它只调用一次
AddToMap

在类或函数之外,
static
关键字提供了一个名称内部链接,这意味着包含它的每个编译单元都有自己的名称版本。因此,在第二个示例中,对于包含
AddKey(MyClass,hello)
的每个*.cc文件,都有一个名为
NS\u MyClass::a\u foo()
的不同函数。这些函数中的每一个都会尝试调用一次
AddToMap
,从而产生冲突问题

使用
内联
而不是
静态
在头文件中定义函数,但每次都必须是相同的函数:

#define AddKey(key, val)\
namespace NS_##key {\
    inline bool A_foo() {\
        static bool dummy = AddToMap(#key, #val);\
    }\
    static bool dummy_A = A_foo();\
}

是否在头文件中展开
AddKey
?是。有一个GetValue在cc文件中展开,AddKey在头文件中展开。这似乎工作顺利。inline似乎可以确保在链接完所有.cc文件后,它是一个单一实例。谢谢
#define AddKey(key, val)\
namespace NS_##key {\
    inline bool A_foo() {\
        static bool dummy = AddToMap(#key, #val);\
    }\
    static bool dummy_A = A_foo();\
}