【无标题】

C++ static 修饰全局变量时的作用探究

作为一个c++开发者,我们面试时经常被问到 static 变量的作用,其中有一个问题是,static 修饰全局变量时起什么作用

通常我们会回答,"static 修饰全局变量时代表限制这个变量为此源文件可见,其他源文件无法访问到这个变量"。

但是之前我更多的是认为重点在于限制作用域,今天的一个小实验让我对它有了更深入的体会。

这里先问一个问题。

如果我们 在 某个头文件中声明一个 static 变量,然后用两个 source file 来引用它,可以做到共享全局变量通信吗?换句话说,某个 cpp 文件改动了它的值,另一个cpp能感知到吗?

答案是不会,实验表明,每一个源文件单独有一份属于自己的static 变量,所以一个源文件的更改不会影响到另一个源文件,这正是面试八股文里 "限制变量为本源文件可见的真正含义"。

  • 头文件 schema.h
cpp 复制代码
#ifndef __SCHEMA__
#define __SCHEMA__
#include <string>

static std::string input_schema = R"(this is input schema)";

#endif
  • 源文件 A help.cpp
cpp 复制代码
#include "help.hpp"

#include <iostream>
using namespace std;
void change_input() {
  input_schema = "new input schema";
  return;
}

void show_input() {
  cout << "help.cpp: " << input_schema << endl;
  cout << "help.cpp: " << &input_schema << endl;
  return;
}
  • 源文件 B main.cpp
cpp 复制代码
#include <iostream>

#include "help.hpp"
// #include "schema.h"
using namespace std;

int main() {
  cout << "main.cpp: " << input_schema << endl;
  change_input();
  cout << "main.cpp: " << input_schema << endl;
  show_input();
  // 打印地址
  cout << "main.cpp: " << &input_schema << endl;
  return 0;
}

输出

main.cpp: this is input schema

main.cpp: this is input schema

help.cpp: new input schema

help.cpp: 0x5631f26841a0

main.cpp: 0x5631f2684180

可以看出, 源文件A(help.cpp) 对 input_schema 的修改只有它自身感知到了,没有影响到 源文件B.

从打印的地址也可以看出,这是两个变量。

相关推荐
码匠许师傅19 小时前
【C++ 面试真题】26. 聊聊 C++ 的智能指针
java·c++·面试
夜不会漫长1 天前
C++入门(1)
开发语言·c++·算法
旖旎夜光1 天前
LeetCode 852:山脉数组的峰顶索引(二分查找) —— 题解
数据结构·c++·算法·leetcode·二分查找
..Dauntless..1 天前
【C++】继承——基类和派生类的配合
开发语言·c++·算法
程与留1 天前
05_Qt 核心模块概览——Qt Core、Gui、Widgets、Quick 的职责划分
c++·qt
buhuizhiyuci1 天前
【QT-百日筑基篇】修真世界摸爬滚打多年,终于黄天不负有心人,突破炼器中期——常用控件QWight的属性
开发语言·c++·qt·gui·图形化
冻柠檬飞冰走茶1 天前
《数据结构实验指导-C++语言版》 求单链表list中的元素个数,即表长
开发语言·数据结构·c++·算法·list
_Narcissus_1 天前
动态规划初探(含完整代码实现)
c语言·数据结构·c++·算法·动态规划·背包问题·最短路径
法哥20121 天前
用 C++ 控制 CMW100,到底在干什么?
开发语言·c++
_Narcissus_1 天前
枚举和模拟算法笔记
c语言·数据结构·c++·笔记·算法·模拟·枚举