C++中的头文件

C++中的头文件

头文件传统上是用来声明某些函数类型,以便可以用于整个程序中。

比如我们在一个文件中创建一个函数,想在另一个文件中使用,当我们尝试编译那个文件时,C++甚至不知道它的存在。所以需要一个共同的地方来存放声明,而非定义,这样可以告诉编译器这个函数的函数名,返回类型,参数等,编译器确信这个函数是存在的。这些声明通常就放在头文件中。当我们想在任何cpp中使用这些函数,就需要include包含这些函数声明的头文件。

cpp文件include****了某个头文件,就会在引用头文件处粘贴头文件中的全部内容。#include其实就是帮我们完成了复制粘贴代码的工作,使代码看起来更加简洁。

头文件保护符

在Visual Studio中,当我们新建了一个.h文件,VS默认会在里面写一行代码:

#pragma once

这是一条预处理指令,也被称为头文件保护符。意味着这个文件被编译之前会被C++的pre processon评估,规定只允许include这个文件1次,防止我们把单个头文件多次include到一个单一编译单元里。注意,它无法防止我们把头文件include到程序的各处,只是防止被include到一个编译单元(单独的CPP文件)里。

因为如果我们不小心把一个文件多次include到一个编译单元内,会得到一个重复的错误,因为我们会多次复制粘贴那个头文件。如下面的情况:

Log.cpp:

#include<iostream>
#include"Log.h"
#include"Common.h"

void Log(const char* message)
{
	std::cout << message << std::endl;
}
void InitLog()
{
	Log("Initialized Log");
}

Log.h:

//#pragma once

void Log(const char* message);
struct student{};

Common.h:

#pragma once
#include "Log.h"
/*
	其他代码
*/

在Log.h头文件里定义了一个结构体student,没有加#pragma once指令,现在Common.h引用了Log.h,Log.cpp同时引用了Log.h和Common.h,这样Log.h相当于被一个编译单元include了两次,会得到多个名为student的结构体,这样就会造成重复定义的错误。

传统方式添加头文件保护符其实是通过#ifndef

#ifndef _Log_H
#define _Log_H

void Log(const char* message);
struct student{};

#endif // !_Log_H

使用#ifndef 检查"_Log_H"符号,然后会定义_Log_H这个符号,然后在头文件最后,输入#endif。这样子在编译时首先会检查"_Log_H"符号是否存在,如果"_Log_H"符号没有被定义,就会将头文件的代码include到编译里,如果"_Log_H"符号已经被定义(说明已经include过了),那这些代码将不会被include,会被全部禁用。

#include后面跟双引号和跟方括号的区别和联系

使用引号和方括号实际上代表两件事。

当我们编译程序时,我们有办法告诉编译器某些include路径,这基本上就是在我们电脑里通往文件夹的路径,他们包含include文件。如果我们想要include的那个文件在这些文件夹中,我们就可以用方括号去让编译器在所有include的路径里面去搜索这个文件。

引号一般用于include相对于自己的相对位置,也可以用于include内目录中的位置,甚至可以在任何地方用引号。方括号永远没有相对位置的概念,include的文件必须存在于所有include目录的某个文件夹内。

另外,为了区分C的标准库和C++的标准库,C标准库的头文件一般都有.h扩展名,而C++没有

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值