http://www.cppblog.com/yindf/archive/2009/03/20/77304.aspx

最近在coding的时候,写了这么一段代码:

A.h

1// A.h
2#include <map>
3
4class A
5{
6public:
7    static std::map<int, int> x;
8};

A.cpp

1// A.cpp
2#include "A.h"
3
4std::map<int, int> Test::x;

很简单,也很正常,看看用法吧。

main.cpp

 1class B
 2{
 3public:
 4    B();
 5};
 6
 7class C
 8{
 9public:
10    static B b;
11};
12
13B C::b;
14
15B::B()
16{
17    A::x[1] = 2;
18}
19
20void main()
21{
22    A::x[3] = 3;
23}

这是因为先在 B::B()使用了静态变量x, 而x还没有初始化。

如果多个cpp文件里包含多个static 变量,初始化的顺序不可以预知。

如果在.h中定义static 就表明这个变量只是属于include这个头文件的编译单元。

好了,按照上面的写法,把代码分别放到3个文件里面,编译,通过, 链接,通过,运行,挂了!!why?
解决方案很简单,把A.cpp里面的那句定义放到main.cpp里面就好了。

问题在于两个static变量分别在两个不同的文件里,A.cpp 里面那static变量要在main.cpp前初始化才行,可是编译器不知道呀,结果main里面的先初始化了,等到调用A.cpp里面那个变量时,已经来不及啦。

这个就是依赖编译器初始化顺序的程序,如果有人运行没有挂,那恭喜啦,等到它挂的时候你可要哭了。

上面的解决方案太烂了,如果程序规模很大,就完了,比如有好几个cpp里面要用到A.cpp里面那个变量,放哪个里面好呢?
这时候,Scott Mayer的Singleton就是解决方案啦,它能保证静态变量在使用前被初始化。

看看下面的代码:

 1class static_
 2{
 3public:
 4   template <int N, class T>
 5   static T& var()
 6   {
 7       static T instance;
 8       return instance;
 9   }
10
11private:
12   ~static_() {}
13};

有了这个定义,想用静态变量的时候就爽啦~~,用的时候:

1static_::var<0, std::string>() = ":)"; 
2static_::var<0, std::map<int, int> >()[0] = 3;
3static_::var<1, std::string>() = "haha";

现在的效果就是,想让Test里面有什么,他就有什么,我指静态变量。注意啦,第一个模板参数是为了可以定义同种类型的多个变量,就相当于
var_0, var_1...

是不是感觉有点动态语言的特性了,变量不用定义就可以用。而且变量初始化顺序也不用关心啦,因为所有的变量会在使用前初始化完毕。

如果和boost::function合作起来,效果更佳。look!

 1class Fun
 2{
 3public:
 4    Fun()
 5        : UId(&static_::var<0, std::string>)
 6    {
 7    }
 8    // interface for static variable.
 9    boost::function<std::string& (void)> UId;
10};
11
12void main()
13{
14    Fun f1, f2;
15    // set static from f1
16    f1.UId() = "abc";
17    // get static from f2
18    std::string str = f2.UId();
19}

好了,static就到这里吧。

static 变量初始化顺序的问题和解决方案相关推荐

  1. 转载:static的初始化顺序

    转自:http://www.cnblogs.com/yfsun1/archive/2006/07/14/450847.html 先看个例子: using System; Class A {  stat ...

  2. Java Static 变量初始化

    目录 Java Static 变量初始化 直接赋值 static块初始化 实例方法初始化 解决方案 Java Static 变量初始化 static变量初始化方式 直接赋值 static块初始化 实例 ...

  3. Java变量初始化顺序

    文章目录 Java变量初始化顺序 Java变量初始化顺序 Ⅰ.Java变量初始化顺序:静态变量或静态语句块(按声明顺序)–> 非静态变量或构造代码块(按声明顺序)–> 构造方法 –> ...

  4. c++构造函数以及类中变量初始化顺序

    c++构造函数以及类中变量初始化顺序 Submitted by ant on Fri, 03/29/2013 - 20:05 构造函数 c++ 的类提供了一种抽象机制,使用起来要比 c 方便很多.为了 ...

  5. java中的static变量初始化_Java初始化静态变量的时间顺序

    1. 开始吧! 今天,我们来探讨交流下静态变量初始化过程.Java虚拟机在类加载期间也同样遵循这个过程. 2. 初始化过程 在较高的层次上,JVM执行以下步骤: 首先,加载并链接类.然后,这个过程的& ...

  6. C++成员变量初始化顺序问题

    由于面试题中,考官出了一道简单的程序输出结果值的题:如下, [cpp] view plain copy  print? class A { private: int n1; int n2; publi ...

  7. c++模板类静态成员变量_一文讲透父子类中静态变量,成员变量初始化顺序原理...

    推荐: 从面试到入职到离职,我在B站工作的30天时光 爱了爱了,Alibaba顶级MySQL调优手册到手,加薪妥了 爱了爱了,Spring Cloud Alibaba内部微服务架构笔记真的太牛了 本文 ...

  8. java静态变量需要初始化吗_» Java静态变量初始化顺序浅谈

    Java 类初始化顺序在网上已经有很多文章了,这里不再谈那么多,仅仅谈下Java静态变量的初始化顺序,如果你是Java高手,并且自认为对这个顺序已经掌握到了炉火纯青的境界,请忽视这篇文章. 前天看了Y ...

  9. Java类中变量初始化顺序

    下面代码显示了静态初始化代码块,非静态实例初始化代码块,构造函数 等在Java中从代码载入内存到代码执行过程的执行顺序: import static net.mindview.util.Print.* ...

最新文章

  1. LiTAMIN2:一种超轻型LiDAR-SLAM(ICRA2021)
  2. 从尾到头打印链表---剑指Offer
  3. C# SHA1散列算法
  4. python replace函数 成功 失败_请教下调用python string模块的replace方法出错的原因
  5. Codeforces 987B. High School: Become Human
  6. http协议之request
  7. 【每日一题】7月3日精讲—毒瘤xor
  8. 任意阶魔方阵matlab程序,【精品】任意阶魔方阵算法(c语言)
  9. 【bzoj1010-toy】斜率优化入门模板
  10. 关于很多人 年底被炒!
  11. shiro分布式控制登录状态_Shiro——强大且易用的Java安全框架(四)
  12. 手机日期插件jquery mobiscroll 实例
  13. TensorFlow实现深度学习算法的教程汇集:代码+笔记
  14. mumu模拟器安装xposed
  15. 如何将txt文件用shell拆分成多个?
  16. 2021英国硕士计算机专业排名,2020年伦敦国王学院先进的计算机专业硕士申请条件-学费-世界排名...
  17. Cohort Analysis组群分析(1)
  18. CAD批量画八边形风机基础平台
  19. 大数据管理与分析技术(1)
  20. Windows + XMAPP + TestLink 初探

热门文章

  1. 八十四、Python | Leetcode回溯算法系列
  2. 十、开始进入PowerBI的世界
  3. 杭州内推 | 阿里云开发者社区招聘计算机视觉算法工程师(2022年毕业生)
  4. 论NLP可解释的评估:什么才是“好”的解释?
  5. 每周论文清单:对话系统综述,全新中文分词框架,视频生成,文字识别
  6. 深度学习语义分割理论与实战指南
  7. Android轮播图实现图片圆角,Android开发实现图片圆角的方法
  8. export default用法vue_Vue组件通信—provide/inject
  9. 解决mysql插入中文出现错误Incorrect string value: ‘\xE7\xA8\x8B\xE5\xBA\x8F...‘ for column ‘course‘ at row 1
  10. php异常处理示例,php异常处理示例