美文网首页
C++链接错误:静态变量的初始化问题

C++链接错误:静态变量的初始化问题

作者: Caucher | 来源:发表于2022-08-01 13:11 被阅读0次

在使用C++时,编译项目时偶尔会发生链接,这些错误很多时候是偶发的,可能再编一次,或者换个模式,换个参数,就没有编译错误了,但之后可能还会出现。由于是在编译阶段,问题不容易排查。这样的错误有可能就是静态变量的初始化问题。

  • 简单概括:当静态变量的初始化过程中,需要其他静态变量的值时,就有可能产生不确定的链接错误。
  • 主要原因:C++不固定静态变量的初始化顺序,在初始化静态变量时,如果你需要其他静态变量的值,但这个值又没有初始化,问题就发生了。
  • 解决方案:
    1. 尽量不要在静态初始化时引入其他静态变量,尤其避免循环依赖。
    2. 将静态变量,放到函数里面去,即:
    A& variable_name(){
      static A variable = ...;
      return variable;
    }
    
    每次想访问这个静态变量时,改为用variable_name()来进行访问,这个函数也没必要是成员函数,跟这个类一起放到头文件里就可以了(内联inline)。在函数内的局部静态变量第一次访问是初始化,之后自动再调用函数自动略过初始化语句。
    1. 为C++入口的_init()函数提供自定义实现,这个函数负责初始化静态变量,在这个函数内部人工确定顺序。(一般非必要不使用)

好的,接下来我们深入剖析下这个问题:

  • C语言没有这样的链接错误:C语言可以很简单的处理初始化变量,无论是基本类型还是结构体,在编译阶段就可以将初始化值放入.data节,自然就不存在这样的问题。C++的对象是由构造函数来构建的,编译时不执行代码,因此无法确定具体值,只能放在运行时完成。
  • 静态变量的初始化如果不牵涉其他任何自定义类型则不会出现问题:因为不会出现顺序问题,所以可以按正常语法初始化。
  • 那些需要其他静态变量的值做初始化的静态变量,最好按照方案2重写避免链接问题。

顺便说一句,对于非静态变量,比如类中的成员变量,在构造函数中,尽量以初始化列表的方式初始化,即

A(int _a, double _b, B & _c)
: a(_a),b(_b),c(_c),d()
{}

如果在函数体内执行,实际上是用默认构造函数初始化了一次,又赋值了一次。
而且,如果是常量对象和引用对象,则必须如此初始化!!

  • 还有一个值得注意的点:类内成员的初始化顺序,是按照他们在头文件中的排列顺序决定的,和构造函数的初始化列表无关。

参考资料:

  • 《Effective C++》第三版,条款04
  • 《高级C/C++编译技术》:第6章

相关文章

  • C++链接错误:静态变量的初始化问题

    在使用C++时,编译项目时偶尔会发生链接,这些错误很多时候是偶发的,可能再编一次,或者换个模式,换个参数,就没有编...

  • 类初始化顺序

    对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺序依次是(静态变量、静态初始化块)>(变量、初始...

  • C++ BUG疑问解答区

    问题: 1.静态成员变量的初始化问题。如果是指针类型的静态成员变量,初始化的时候new了一下,什么时候delete...

  • java类初始化机制

    初始化顺序 无继承类初始化 初始化顺序静态变量/静态代码块 -> 成员变量/代码块 -> 构造函数其中,静态变量与...

  • 2018-12-05 今日小结

    今日学习(写完的时候已经是昨天了。。) Java类和对象,内部类,静态变量/方法,静态初始化块,封装;C++复习复...

  • C++静态变量的初始化

    C++静态变量的初始化 摘要 在开发中经常会有一些全局的静态的对象,譬如logHandler,这些全局对象的使用可...

  • C++中的成员变量和成员函数

    C++中的类有两个成分: (1)成员变量 成员变量按照作用域分为静态成员变量和非静态成员变量,C++中成员变量的默...

  • C++入坑记(3)

    变量初始化问题 当局部变量被定义时,系统不会自动对其初始化;当全局变量被定义时,系统会初始化为下列值: C++储存...

  • 设计模式——工厂,策略,建造者

    Java 类初始化顺序基本分为以下几种:静态块,初始化块,静态方法,构造函数块,静态变量,成员变量对于块顺序,静态...

  • c++ python java

    c++ 初始化 C++类中成员变量的初始化有两种方式 - yu132563的专栏 - CSDN博客 C++ 变量初...

网友评论

      本文标题:C++链接错误:静态变量的初始化问题

      本文链接:https://www.haomeiwen.com/subject/crkrwrtx.html