为了支持 分离式编译(separate compilation) 机制,C++ 语言将声明和定义分开来,声明(declaration) 使得名字为程序所知,一个文件如果想使用别处定义的名字则必须包含对那个名字的声明;而定义(definition) 负责创建与名字关联的实体。
如果要在多个文件中使用同一个变量,就必须将声明和定义分离。
声明规定了变量的类型和名字,在这一点上定义与之相同。但是除此之外,定义还要申请存储空间,也可能会为变量赋一个初始值。
如果声明一个变量而非定义它,就在变量前面加关键字extend,而且不要显示的初始化变量。
extern int i; #声明i而非定义i
int j;#声明并定义j
任何包含了显式初始化的声明即成为定义。我们能给由 extern
关键字标记的变量赋一个初始值,但是这么做也抵消了 extern
的作用,extern
语句如果包含初始值就不再是声明,而变成定义了。
extern int i = 0; #定义
但是只有当 extern
声明位于函数体外部时,才可以被显式初始化。在函数体内部,如果试图初始化一个由 extern
关键字标记的变量,将引发错误。
变量只能被定义一次,但是可以被多次声明。
如果要在多个文件中使用同一个变量,就必须将声明和定义分开。
调用另一个文件里面的函数:
//student.h
class Student {
public:
const char *name;
int age;
float score;
void say();
};
//student.cpp
#include <iostream> //std::cout、std::endl
#include "student.h" //Student
void Student::say() {
std::cout << name << "的年龄是" << age << ",成绩是" << score << std::endl;
}
//main.cpp
#include "student.h" //Student
int main() {
Student *pStu = new Student;
pStu->name = "小明";
pStu->age = 15;
pStu->score = 92.5f;
pStu->say();
delete pStu; //删除对象
return 0;
}
编译:# g++ main.cpp student.cpp -o student.exe
调用另一个文件里面的变量:
https://blog.csdn.net/qq_27664167/article/details/82859852
//student.cpp
int a = 0;
//main.cpp
#include <iostream>
extern int a;
int main() {
std::cout<< a <<std::endl;
return 0;
}
需要调取其他文件的全局变量时:extern int a;
显式的说明了a的存储空间是在程序的其他地方分配的,在文件中其他位置或者其他文件中寻找a这个变量。
第二种方法:
例如a.c文件中定义int a = 5和一个函数,在a.h里写extern int a;,如果要在其他文件里调用a这个变量和函数,直接#include<a.h>即可。
不建议在.h文件中int a = 0;,因为当多个文件包含该头文件的时候,#include相当于复印了一份代码,就会导致变量重复定义,变量只能定义一次。