当前位置:   article > 正文

外部变量的使用

外部变量

目录

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

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

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

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


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

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

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

比如:

  1. //a.cpp文件中:
  2. int a=333
  3. int function1(){return 444;}
  4. //b.cpp文件中:
  5. #include <iostream>
  6. extern int a;
  7. extern int function1();
  8. int main()
  9. {
  10. std::cout<<a<<std::endl;
  11. std::cout<<function1()<<std::endl;
  12. }

这样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文件,相应的三个文件如下。

  1. //a.h文件
  2. extern int a;//a变量声明
  3. extern int fun1();//fun1()函数声明
  4. //a.cpp文件
  5. extern int a=333;//a的定义
  6. int fun1(){return 444;}//fun1的定义
  7. //b.cpp文件
  8. #include “a.h”
  9. #include <iostream>
  10. int main()
  11. {
  12. cout<<a<<std::endl;
  13. std::cout<<fun1()<<std::endl;
  14. }

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

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

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

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/nx123/article/detail/63307?site
推荐阅读
相关标签
  

闽ICP备14008679号