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

开发者 2024-9-14 12:02:08 38 0 来自 中国
在使用C++时,编译项目时偶尔会发生链接,这些错误很多时间是偶发的,大概再编一次,或者换个模式,换个参数,就没有编译错误了,但之后大概还会出现。由于是在编译阶段,题目不容易排查。如许的错误有大概就是静态变量的初始化题目。

  • 简朴概括:当静态变量的初始化过程中,须要其他静态变量的值时,就有大概产生不确定的链接错误。
  • 紧张原因:C++不固定静态变量的初始化序次,在初始化静态变量时,假如你须要其他静态变量的值,但这个值又没有初始化,题目就发生了。
  • 办理方案:

    • 只管不要在静态初始化时引入其他静态变量,尤其避免循环依靠。
    • 将静态变量,放到函数内里去,即:
    A& variable_name(){  static A variable = ...;  return variable;}每次想访问这个静态变量时,改为用variable_name()来进行访问,这个函数也没须要是成员函数,跟这个类一起放到头文件里就可以了(内联inline)。在函数内的局部静态变量第一次访问是初始化,之后主动再调用函数主动略过初始化语句。

    • 为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章
您需要登录后才可以回帖 登录 | 立即注册

Powered by CangBaoKu v1.0 小黑屋藏宝库It社区( 冀ICP备14008649号 )

GMT+8, 2024-11-22 23:22, Processed in 0.120985 second(s), 32 queries.© 2003-2025 cbk Team.

快速回复 返回顶部 返回列表