外部变量的使用

目录

1. 外部变量的定义和声明

2. 外部变量放在头文件中

3. 不希望成为外部变量的变量的处理

4. const修饰的变量(常量),inline函数可以放在头文件中


外部变量指的是文件外部定义的变量,在多文件组织中,一个源文件难免会使用另一个源文件的函数或变量。当一个源文件需要使用外部变量的时候,需要在函数开头用extern声明该变量或函数为“外部”,也就是声明其已经在其它文件中定义。外部变量的使用,需要注意以下几点。

1. 外部变量的定义和声明

在源程序文件中,函数外部定义的变量作用域都是全局作用域,也就是所所有的其它源文件都可以使用。然而,其它源文件要使用它们,还得需要使用extern来声明,就如同要使用其它文件的函数一样。

比如:

//a.cpp文件中:

int a=333;

int function1(){return 444;}

//b.cpp文件中:

#include <iostream>

extern int a;

extern int function1();

int main()

{

       std::cout<<a<<std::endl;

       std::cout<<function1()<<std::endl;

}

这样b.cpp文件中就可以使用a.cpp文件中的a变量和function1函数。

这里要注意的是,对于外部的函数,我们声明的时候可以使用extern,也可以不用,程序会在源程序中寻找相应的同名函数的定义;然而对于变量,使用外部变量的时候必须使用extern来进行标识,说明其是外部定义的变量,否则会有重复定义的错误。还有一点比较重要的一点是,变量定义的时候也可以使用extern来声明,来表明其准备成为外部变量,为其它程序所使用,当然变量只能在一个源文件中定义,其它文件只能声明不能定义。比如上面a.cpp文件中Int a=333;可以用extern a=333;来代替,效果是一样的。

2. 外部变量放在头文件中

对于一个变量或函数,它的定义只能有一个,也就是在.cpp文件中定义,但它的声明可以有多处。为了方便使用,我们可以将外部变量和函数的声明放在.h头文件中,这样每次include头文件,就可以使用头文件中声明的外部变量,其效果和我们手动在程序开头添加外部变量和函数的声明是一样的。

因此,外部变量和函数的正确使用方式是这样的:在头文件(.h文件)使用extern声明外部变量,使用或不使用(一般不使用)extern来声明函数,然后在其实现文件(.cpp文件)中来实现相应的定义;当需要使用外部变量的时候,只需要include头文件就可以了。

举例:上面增加a.h文件,相应的三个文件如下。

//a.h文件

extern int a;//a变量声明

extern int fun1();//fun1()函数声明

//a.cpp文件

extern int a=333;//a的定义

int fun1(){return 444;}//fun1的定义

//b.cpp文件

#include “a.h”

#include <iostream>

int main()

{

       cout<<a<<std::endl;

       std::cout<<fun1()<<std::endl;

}

这里一定要注意的是:头文件中只能声明变量和函数,正常的函数和变量不能在头文件中进行定义。

3. 不希望成为外部变量的变量的处理

如果不希望成为外部变量或者外部函数,换句话说,就是希望某个全局变量仅在本文件当中进行使用,而不被其它文件使用(这里实际上是链接性的概念,只能在本文件使用的链接性为内部,否则为外部)。使用static修饰的全局变量和函数链接性为内部,只能在本文件中使用

4. const修饰的变量(常量),inline函数可以放在头文件中

上面说到,变量和函数的定义不能放在头文件中,因为头文件可能被不同的文件所包含,如果定义放在头文件中,会造成重复定义的error。但是,这里有两个意外,const变量和内联函数可以放在头文件中,这是因为const修饰的变量内容不会改变,基本上等同于常量,因此被包含不会造成不同定义的错误;而inline函数会在函数调用的位置展开,因此头文件中包含inline函数也不会造成不同定义的冲突。至于const变量和inline函数的具体规则,在其它部分会做出总结。

  • 9
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值