C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了C类静态函数成员中的静态数据成员初始化顺序大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_489_0@
@H_489_0@
我有一个宏,我用它来添加键,值到注册表映射. (假设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()的原因相同.但是为什么静态变量虚拟的行为在静态函数中与在类的静态成员中时不同?

@H_944_24@解决方法
在类中,static关键字不会影响链接,但意味着它独立于类对象.无论你有多少次AddKey(MyClass,Hello),只有一个函数NSP_MyClass :: A :: foo(),它只调用一次AddToMap.

在类或函数之外,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();\
}
@H_489_0@

大佬总结

以上是大佬教程为你收集整理的C类静态函数成员中的静态数据成员初始化顺序全部内容,希望文章能够帮你解决C类静态函数成员中的静态数据成员初始化顺序所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签:c函数初始化成员数据静态顺序
猜你在找的C&C++相关文章
其他相关热搜词更多
phpJavaPython程序员load如何string使用参数jquery开发安装listlinuxiosandroid工具javascriptcap