C++头文件

在C++基础上,头文件传统上是用来申明某些函数类型,以便用于整个程序中。在链接器章节中我们知道,为了让我们知道函数和类型的存在,我们需要某种声明。
我们需要一个共同的地方存放函数声明,只是声明,没有实际的定义,没有函数的主体。

案例

假设在主文件生成一个c++文件定义了Log函数
main.cpp

#include <iostream>
void Log(const char* message)
{
	std::cout<<message<<std::endl;
}
int main()
{
	std::cout<<"hello world "<<std::endl;
	std::cin.get();
}

在log.cpp中
在这里插入图片描述
在这里还有一个log.cpp中使用了Log函数,我们拿到一个错误,log函数不再该文件中,该文件不知道log函数的存在。我们在main中可以正常使用,在log.cpp中会报错。所以log.cpp到底需要沙漠才不会报错。
如何才能告诉它,log函数存在,只是区别于别的地方。
这时是函数申明的使用之地。
在这里插入图片描述
加入函数声明后可以正常使用按ctrl+f7可以编译。对项目编译也可以看到链接成功,因为可以找到log函数。
我们告诉了log.cpp那个函数存在某处,如果我们创建另外一个文件呢?我们创建一个别的文件,然后使用这个log函数呢?
这意味这个void log声明可以到处复制黏贴吗?
答案是的,你确实需要怎么做,但是有一个方法可以让一切简单一点。
就是头文件

头文件

头文件一般被include到cpp文件里面,基本就是复制和黏贴进cpp文件里。我们创建一个头文件,上图中的文件夹都是过滤器并不是真正的文件夹。我们可以在资源文件下创建一个头文件。其实就是无论在什么地方创建头文件都没关系
在这里插入图片描述
在这里插入图片描述
此时我们将头文件剪切放在这里。我们的头文件log.h,我么可以在任何想用log函数的地方include它,然后显然他会帮我们做哪些我们不想人工做的事。
其实我们还可以include“log.h”到main.cpp,main.cpp包含实际的函数定义,所以我们并不需要它,我们反正可以调用log。但加进去也不会报错。

如果我们在main中调用initLog会报错所以我们需要去log头文件把函数签名加进去。

void Log(const char* message);
void initLog();

此时可以在main中调用

pragma once

在这里插入图片描述
pragma once意思是只include这个文件一次,是一种头文件保护符
他所作的是防止我们把单个头文件多次include到一个单一翻译单元中。
其实不会防止我们把头文件include到程序各处,只防止到一个翻译单元里,也就是一个单独的cpp文件,原因是我们不小心把一个文件多次include到一个翻译单元中。我们会得到一个重复的错误,因为我们会多次复制和黏贴那个头文件。一个比较好的办法是我们创建一个Struct
在这里插入图片描述
我们可以创建一个struct player{},如果我们把这个文件,两次应付得到一个翻译单元,并且没有头文件保护。他会真的include这个文件两次,也就是我们会有两个structs,他们有相同的名字player。
如果我们去掉#pragma once 并如下图引入两次Log.h。
在这里插入图片描述
我们会得到一个player structure重复定义的问题。
也许会觉得自己不会干这个种事,但是c++种会出现套娃的问题。
比如有一个头文件player include log,然后player 又被inlude到其他文件。假如我们创建一个common也包含log.h。如下图把pragam once 注释掉
在这里插入图片描述
在这里插入图片描述
此时main中也会出现同样问题。
如果log.h不再一个文件夹中,比如它目前存在log.cpp的上一级目录中,可以使用…/来返回上一级目录
在这里插入图片描述iostream
“”也可以用来告诉编译器位置,可以在任何地方用,我们可以把iostream换成引号,将完全没有问题。所以方括号只用于编译器include路径,引号用于所有。但我一般只喜欢将它用于相对位置,还不如方括号。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值