cpp的头文件就是以.h结尾的文件。
需要注意的是,在windows平台上面,#include <头文件.h>
头文件名是不区分大小写的,也就是
#include <windows.h>
#include <Windows.h>
这两个include指令是一样的意思。
头文件里面可以声明一些方法或者是全局变量。
所谓全局变量,就是没有在方法或或者类外部的变量。
注意是声明,声明一个变量前面要加上extern 表示它只是声明 具体的定义,赋值,可以在cpp文件中操作。
声明一个函数就是只写函数头。也就是没有函数体,大括号就是函数体。
为什么不能定义全局变量和函数呢?因为,如果这个头文件被多个cpp文件引用的话,就可能出现LNK1169 错误,找到一个或多个重定义的符号。
比如这样,我们在header里面定义了一个全局变量。
header.h
#ifndef _header_
#define _header_
int a = 100;
void firstMethod();
void secondMethod();
#endif
然后两个cpp文件去实现 两个method
first.cpp
#include "header.h"
#include <iostream>
using namespace std;
void firstMethod() {
cout << "firstmethod" << endl;
}
second.cpp
#include "header.h"
#include <iostream>
using namespace std;
void secondMethod() {
cout << "secondmethod" << endl;
}
可以看到 header.h声明的函数。我们可以分别在不同的cpp文件中去定义具体的实现。
最后是 main.cpp
#include <iostream>
#include "header.h"
using namespace std;
int main()
{
firstMethod();
secondMethod();
cout << "Hello World!\n" << endl;
}
然后我们运行,报错。
提示的正式一个或多个重定义的符号。
所以我们只能在头文件中声明变量。前面加上extern关键字。
header.h
#ifndef _header_
#define _header_
extern int a;
void firstMethod();
void secondMethod();
#endif
此时再运行项目,就不会提示报错。
然而我们无法使用它。
main.cpp
#include <iostream>
#include "header.h"
using namespace std;
int main()
{
firstMethod();
secondMethod();
cout << a << endl;
}
如上面,我们使用的时候,会报LNK2001无法解析的外部符号。为什么呢,因为此时我们还没有对a定义。报错信息如下
这个时候我们再其中一个cpp文件中定义a的值,如下
first.cpp
#include "header.h"
#include <iostream>
using namespace std;
int a = 10000;
void firstMethod() {
cout << "firstmethod" << endl;
}
然后再运行项目
可以看到打印出了10000
细心的你可能说,我first.cpp文件 second.cpp文件都引入了header.h那么我们两个文件都定义a的值会怎样。还会报一个或多个重定义的符号。原因引入定义全局变量的头文件一样。
extern 的作用就是告诉编译器,我可以使用这个变量并且不用定义。因为,他已经在别的文件中定义过了(被链接到了obj文件当中了)。
所以,你大可用extern 去欺骗编译器,例如这样
extern int c;
int main()
{
cout << c << endl;
}
没有任何一个定法定义了int c 变量。然而你直接使用通不过编译,会提示未定义标识符。如果加上 extern int c;这句话,意思就是去别的obj文件中查找c的值(源文件先被编译为obj文件,然后链接为exe可执行文件)。虽然你没有在任何一个地方定义c的值。
但是运行的时候肯定是会报错的
提示LNK2001无法解析外部符号。跟上面一样。