C与C++中的符号隐藏

C语言中的符号隐藏:

我们知道,在C语言中,在.c文件中定义一个全局的变量,如果要在其他.c文件中访问,我们需要使用到extern,声明这个变量是引用的其他源文件中的变量,编译器在进行符号整理后,会给该符号一个正确的地址。

当我们希望仅仅在当前文件访问一个符号(无论是函数还是变量),不希望其他源文件访问,也就是隐藏符号,我们可以使用static进行修饰。由于被static修饰的符号是local类型的,编译器不连接local符号,只处理globall符号。

// example.c

static int a = 100; //local

int b = 100;       //global

int sum1(int c,int d)        //global 全局符号
{
	//...
}

static int sum2(int e,int f)  //local 内部符号
{
	//...
}

Modular C风格的设计最基本的就是将状态(全局变量)和无需暴露的函数通过static隐藏到编译单元内部,只将真正的API接口声明到头文件中。所以,我们应该尽可能多的使用static来修饰函数或者全局变量,这是一个好的编程习惯。

C++中的符号隐藏

访问限定符

从C语言转到面向对象的C++中,第一感觉是多了类,而类提供了public,protected,private三种访问限定符,其中public是开放的,谁都可以访问,protected多用于继承体系中,旨在子类能够访问,private表示私有的,除了自己,谁都不能访问。

我们应该尽可能少暴露符号,所以,设计类的时候,能多用private,就使用private。

当然,访问限定符并不是用来隐藏符号的,隐藏符号可以使用匿名空间。

匿名空间

熟悉C++的同学都知道,为了避免名字重复,引起编译等错误,我们一般要求使用名字空间将我们的类或者方法包裹起来:

// example.h

namespace util
{
class File
{
	//...
};
}

但是这样,外部还是很容易的访问到类File,比如util::File的方式。

C++提供了匿名空间,功能上类型C中的static,被匿名空间包裹的符号,不能被导出,也就是不能在其他源文件中访问
代码看起来更加的干净舒服

//exmple.pp

namespace
{
	int Count = 0;
	struct Test
	{
		//...
	}
}

int fun()
{
	if(Count > 0)
	{
		//dosomething
	}
	else
	{
		++Count;
	}
	Test t;
	
	//...
}

总结:

  1. C语言中能使用static尽可能使用static,避免使用extern;
  2. 能使用private尽量使用private;(不影响后续扩展的前提);
  3. 将类的静态私有成员转移到实现文件的匿名命名空间中;
  4. 在某些情况下,可以将类的私有方法重构成类的静态私有方法,然后移入到实现文件的匿名命名空间中;
  5. 对于某些严重的头文件耦合问题,可以选择使用PIMPL方法,隐藏类的所有非公开成员及其依赖的头文件。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值