#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()的原因相同.但是为什么静态变量虚拟的行为在静态函数中与在类的静态成员中时不同?
在类或函数之外,static关键字给出了一个名称内部链接,这意味着包含它的每个编译单元都有自己的该名称版本.所以在你的第二个例子中,每个* .cc文件都有一个名为NS_MyClass :: A_foo()的不同函数,包括AddKey(MyClass,Hello).这些函数中的每一个都会尝试调用AddToMap一次,从而为您提供碰撞问题.
使用内联而不是静态在头文件中有一个函数定义,但每次都有相同的函数:
#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类静态函数成员中的静态数据成员初始化顺序所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。