C语言使用extern声明外部变量实现全局变量的多文件访问

问题引入

在编写大型C语言程序的时候,往往需要多文件组织。有时也需要多个文件共同对某个全局变量进行读写操作。当然一个比较笨的办法就是将此变量的值写入一个文件中,然后其他程序文件对该文件进行读取从而实现值的修改。显然这样的操作效率是非常低的,大量的文件IO势必会拖慢程序运行的速度。除此之外,也可以使用全局变量的思想,此时不但需要合理组织文件的包含关系,也需要对一些变量做严谨的声明。本文主要介绍使用extern关键字说明外部(全局)变量,从而实现多个程序文件访问并修改变量。

样例代码

main.cpp

#include 
#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 
#include "global.h"

int var;
int func(int n){
    return var*n*n;
}

global.h

#include 

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

几点注意事项

  1. 一般把变量以及函数的声明(要注意声明不是定义。对于函数而言只需要写函数头;对于变量而言不需要赋初始值)放在.h头文件中,变量和函数的定义(实现)放在同名的.cpp中。
  2. extern属于声明的关键字,因此应放到头文件中。对应cpp程序中则不需要再加extern声明了,直接定义(实现)即可。
  3. 如果不用extern声明,上面的例子中main.cpp,A.cpp都包含了global.h,那么编译链接的时候就会出出现“ multiple definition of `var’;“的提示,也就是被重复定义。
  4. Makefile的写法可以参考其他博客,不是很难的,本例中便于多个Cpp文件编译和链接,使用了Makefile。

你可能感兴趣的:(程序设计实践,c语言,c++,开发语言)