面试题:C++ 中未初始化和已初始化的全局变量放在哪里?全局变量定义在头文件中有什么问题?

C++ 中未初始化和已初始化的全局变量放在哪里?

在 C++ 中,全局变量(包括未初始化和已初始化的)的存储位置取决于它们的初始化状态:

  1. 已初始化的全局变量
  • 存储在数据段(Data Segment)中的 .data 段
  • 这些变量在程序启动时已经被赋予了初始值。
  1. 未初始化的全局变量
  • 存储在数据段(Data Segment)中的 .bss 段(Block Started by Symbol)。
  • 这些变量在程序启动时会被系统自动初始化为 0(或空指针)。
  1. 常量全局变量
  • 如果全局变量被声明为 const,则存储在 .rodata 段(只读数据段)。

全局变量定义在头文件中有什么问题?

将全局变量直接定义在头文件中可能会导致以下问题:

  1. 重复定义错误
  • 如果在头文件中定义了全局变量(例如 int globalVar = 10;),而该头文件被多个源文件(.cpp 文件)包含,则会导致链接错误(Linker Error),因为每个源文件都会生成一个相同的全局变量定义,违反了 One Definition Rule (ODR)错误示例
   // globals.h
   int globalVar = 10;  // 定义全局变量
   // a.cpp
   #include "globals.h"
   // b.cpp
   #include "globals.h"

编译时会报错:

   multiple definition of `globalVar`
  1. 命名冲突
  • 如果多个头文件中定义了相同名称的全局变量,会导致命名冲突。
  1. 难以维护
  • 全局变量的定义分散在多个头文件中,会增加代码的维护难度。

如何正确使用全局变量?

为了避免上述问题,可以按照以下方式使用全局变量:

  1. 在头文件中声明,在源文件中定义
  • 在头文件中使用 extern 声明全局变量,然后在某个源文件中定义它。 正确示例
   // globals.h
   extern int globalVar;  // 声明全局变量
   // globals.cpp
   #include "globals.h"
   int globalVar = 10;  // 定义全局变量
   // a.cpp
   #include "globals.h"
   // b.cpp
   #include "globals.h"
  1. 使用静态全局变量
  • 如果全局变量只在单个源文件中使用,可以将其声明为 static,限制其作用域。 示例
   // a.cpp
   static int localVar = 10;  // 只在 a.cpp 中可见
  1. 使用命名空间
  • 将全局变量放在命名空间中,避免命名冲突。 示例
   // globals.h
   namespace Globals {
       extern int globalVar;
   }
   // globals.cpp
   #include "globals.h"
   namespace Globals {
       int globalVar = 10;
   }

总结

  • 已初始化的全局变量存储在 .data 段,未初始化的全局变量存储在 .bss 段。
  • 全局变量不应直接定义在头文件中,否则会导致重复定义错误。
  • 正确做法是在头文件中使用 extern 声明全局变量,在源文件中定义。
  • 可以使用 static 或命名空间来限制全局变量的作用域,避免命名冲突。
THE END
点赞12 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容