如何限制extern变量仅可通过指定函数修改,禁止其他文件直接访问
实现方案
核心思路是把bar变量的可见性限制在foo.cpp编译单元内,对外只暴露修改函数接口,具体修改如下:
步骤1:修改foo.h头文件
删除对外暴露bar变量的extern声明,仅保留函数接口:
#ifndef FOO_H #define FOO_H // 移除extern int bar声明,不对外暴露变量存在 void change_bar_value(const int& value); #endif
步骤2:修改foo.cpp实现文件
给bar变量加上内部链接属性,仅允许当前编译单元访问,有两种等价实现方式:
- 方式1:用
static修饰全局变量
#include "foo.h" // static修饰后,bar仅在foo.cpp内可见,外部无法链接访问 static int bar = 10; void change_bar_value(const int& value) { bar = value; }
- 方式2:将
bar放入匿名命名空间(C++更推荐的写法)
#include "foo.h" namespace { // 匿名命名空间内的变量仅当前编译单元可见 int bar = 10; } void change_bar_value(const int& value) { bar = value; }
效果验证
修改完成后,原main.cpp中的bar = 20语句会直接报编译错误(提示bar未定义),仅保留change_bar_value(20)调用时可正常编译运行,符合仅允许通过接口修改bar的需求。
内容的提问来源于stack exchange,提问作者justANewb stands with Ukraine
相关产品推荐
相关产品推荐

