赞
踩
目录
4. const修饰的变量(常量),inline函数可以放在头文件中
外部变量指的是文件外部定义的变量,在多文件组织中,一个源文件难免会使用另一个源文件的函数或变量。当一个源文件需要使用外部变量的时候,需要在函数开头用extern声明该变量或函数为“外部”,也就是声明其已经在其它文件中定义。外部变量的使用,需要注意以下几点。
在源程序文件中,函数外部定义的变量作用域都是全局作用域,也就是所所有的其它源文件都可以使用。然而,其它源文件要使用它们,还得需要使用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;来代替,效果是一样的。
对于一个变量或函数,它的定义只能有一个,也就是在.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;
-
- }
这里一定要注意的是:头文件中只能声明变量和函数,正常的函数和变量不能在头文件中进行定义。
如果不希望成为外部变量或者外部函数,换句话说,就是希望某个全局变量仅在本文件当中进行使用,而不被其它文件使用(这里实际上是链接性的概念,只能在本文件使用的链接性为内部,否则为外部)。使用static修饰的全局变量和函数链接性为内部,只能在本文件中使用。
上面说到,变量和函数的定义不能放在头文件中,因为头文件可能被不同的文件所包含,如果定义放在头文件中,会造成重复定义的error。但是,这里有两个意外,const变量和内联函数可以放在头文件中,这是因为const修饰的变量内容不会改变,基本上等同于常量,因此被包含不会造成不同定义的错误;而inline函数会在函数调用的位置展开,因此头文件中包含inline函数也不会造成不同定义的冲突。至于const变量和inline函数的具体规则,在其它部分会做出总结。
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。