c++头文件的作用与使用方法以及extern 关键字的作用

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无法解析外部符号。跟上面一样。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值