C++中变量的作用范围(可见范围)

  • 局部变量:

      作用域为当前代码块,即{}中。在代码块外部不可见。

  • 静态变量:

  1. 局部静态变量,即在代码块中声明的静态变量,作用域为当前代码块,超过该代码块则不可见:
static int a = 0;
void Test()
{
	static int a = 0;
}

     2.类静态成员变量,作用域为当前类,超出类范围则不可见

static int a;
class Test
{
	static int a;
};

     3.全局静态变量,不在类中也不在代码块中。该变量作用范围在当前文件。

        a.cpp 中定义static int a = 0;    b.cpp中定义static int a=0;

       编译链接通过,因为a.cpp和b.cpp都不知道对方有a,故各自使用各自的。

  • 全局变量

全局变量作用范围为整个模块\工程,如果其他文件中有定义同名变量,链接器会报符号重定义,如果确实想在整个模块中使用一个变量。则需要在一个cpp中定义,其他引用的地方需要extern修饰声明使用该变量:

a.cpp定义int _a = 0;   b.cpp中使用: extern int _a; _a = 1;

任何全局变量,静态\非静态,都不应该被定义在.h文件中,因为.h文件会被其他文件包含,如果是非静态全局变量,在链接时会直接报符号重定义,因为.h被cpp包含一次,就会多一次定义。 如果是静态全局变量,则比较隐晦,连接器不会报错,但是包含该.h的cpp都会有一个该变量的定义,结果是各自使用各自的,除非清楚这样的作用,否则绝不应该使用。建议永远不要再.h中定义全局变量,无论是否静态。

 

特别:

对于类中声明的静态变量,.h被多次包含后并不会报错,这是因为,类中的静态成员仅仅是声名,真正的定义是在类的cpp中定义的,所以无论包含了多少次.h,变量的定义始终只有一份。

函数符号的可见跟全局变量相同,因此头文件中也不要定义函数,会导致包含这个头文件的其他CPP重定义。如果想在.h中定义函数,可以用inline修饰,内联函数没有这个限制。

说说C++的模块组织,.h用来存放类型声明,包括类,函数,和const变量,.cpp中用来存放类定义,函数定义,和静态\全局变量的定义。

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值