问题引入
在编写大型C语言程序的时候,往往需要多文件组织。有时也需要多个文件共同对某个全局变量进行读写操作。当然一个比较笨的办法就是将此变量的值写入一个文件中,然后其他程序文件对该文件进行读取从而实现值的修改。显然这样的操作效率是非常低的,大量的文件IO势必会拖慢程序运行的速度。除此之外,也可以使用全局变量的思想,此时不但需要合理组织文件的包含关系,也需要对一些变量做严谨的声明。本文主要介绍使用extern关键字说明外部(全局)变量,从而实现多个程序文件访问并修改变量。
样例代码
main.cpp
#include <iostream>
#include "global.h"
#include "A.h"
using namespace std;
int main(){
var=3;//对外部变量var赋初始值
int n=5;
cout<<"main函数对外部变量var赋初始值后,var值和函数调用的值如下\n"<<var<<endl;
cout<<func(n)<<endl;//测试外部变量、外部函数的使用
cout<<"A文件中 funcA函数对外部变量var修改,函数调用的值和var的值如下"<<endl;
cout<<funcA(n)<<endl;
cout<<var<<endl;
return 0;
}
global.cpp
#include <iostream>
#include "global.h"
int var;
int func(int n){
return var*n*n;
}
global.h
#include <stdio.h>
extern int var; // 声明外部变量
extern int func(int n); // 声明外部函数
A.h
int funcA(int n);
A.cpp
#include "global.h"
#include "A.h"
int funcA(int n){
var=2;
return n*n*n/var;
}
Makefile
CC=g++
target=main
srccpp=main.cpp global.cpp A.cpp
obj=$(srccpp:.cpp=.o)
all:$(target)
$(target):$(obj)
$(CC) $(obj) -o $(target)
.cpp.o:
$(CC) -c $< -o $@
clean:
rm *.o $(target)
运行结果
main函数对外部变量var赋初始值后,var值和函数调用的值如下
3
75
A文件中 funcA函数对外部变量var修改,函数调用的值和var的值如下
62
2
几点注意事项
- 一般把变量以及函数的声明(要注意声明不是定义。对于函数而言只需要写函数头;对于变量而言不需要赋初始值)放在.h头文件中,变量和函数的定义(实现)放在同名的.cpp中。
- extern属于声明的关键字,因此应放到头文件中。对应cpp程序中则不需要再加extern声明了,直接定义(实现)即可。
- 如果不用extern声明,上面的例子中main.cpp,A.cpp都包含了global.h,那么编译链接的时候就会出出现“ multiple definition of `var’;“的提示,也就是被重复定义。
- Makefile的写法可以参考其他博客,不是很难的,本例中便于多个Cpp文件编译和链接,使用了Makefile。