学过编译原理基础的都知道,C++项目编译的过程先是编译单个.cpp文件得到.obj文件,然后再把.obj文件链接起来得到一个可执行文件。
所以在一个.cpp文件中定义的全局变量或者函数在另外一个.cpp文件中是不能访问的。为了在一个a.cpp文件中能访问另一个b.cpp文件中的变量或者函数,我们可以在a.cpp文件中用extern对函数或者变量声明。例如:
在print.cpp文件中
#include<iostream>
using namespace std;
void print(char *s)
{
printf("The string is %s/n", s);
}
在extern.cpp文件中
#include "stdio.h"
#include<iostream>
extern void print(char *s);
int main(int argc, char* argv[])
{
char *p = "hello world!";
print(p);
system("pause()");
return 0;
}
程序运行结果:
extern关于变量的用法也差不多
在print.cpp中
int haha;
在extern.cpp中
#include<iostream>
using namespace std;
extern int haha;
int main(int argc, char* argv[])
{
haha = 1;
cout << haha << endl;
system("pause()");
return 0;
}
程序运行结果
如果我们不想在.cpp文件中进行变量或者函数的extern声明,我们可以在一个头文件中声明,然后在.cpp文件#include就可以了(也推荐这种做法)。
以变量的为例,
在print.cpp文件中
int haha;
在wo.h文件中
extern int haha;
在extern.cpp文件中
#include<iostream>
#include"wo.h"
using namespace std;
int main(int argc, char* argv[])
{
haha = 1;
cout << haha << endl;
system("pause()");
return 0;
}
程序运行结果
注:(对于函数,定义的时候可以加extern,此处仅表示该函数已经在其他地方用extern声明为整个工程范围内的全局函数,语法上并没有什么作用,可以理解为注释。
但对于变量,不能在定义的时候加extern,否则会出现链接时错误。我想其中的原因是函数的函数体是有{}的,所以加不加extern都可以知道是函数定义还是函数声明。但对于变量则不好区分,如果在定义的时候加了extern就会被编译器理解为声明,于是该变量就缺少了定义。)