C++头文件编写的一点内容

#include 的" " 与 <>

#include <>:编译器先在系统路径中寻找头文件,如果没有找到,则到当前路径下寻找。
#include “”: 在当前源文件路径下寻找,如果找不到,再到系统路径中寻找。
若 #include “” 查找成功,则遮蔽 #include <> 所能找到的同名文件;否则再按照 #include <> 的方式查找文件。

另外标准库头文件都放在 #include <> 所查找的位置。所以对我们的应用来说, #include <> 的查找位置是标准库头文件所在目录, #include “” 的查找位置是当前源文件所在目录。
但需要知道的是,这些可以通过编译器的配置来更改。

头文件的内容

头文件中编写类的声明(包括类里面的成员和方法的声明)、函数原型、#define常数等。
在头文件的开头和结尾需要插入如下样式

#ifndef 头文件名
#define 头文件名
//代码块
#endif 

例如一个冒泡排序算法的头文件定义:

#ifndef BUBBLESORT_H
#define BUBBLE_H

#include<vector>
using namespace std;

class Bubblesort
{
public:
	Bubblesort(vector<int> &v);//构造函数声明
private:
	int temp = 0;
};
#endif // !BUBBLESORT_H

Bubblesort.cpp源文件:

#include"Bubblesort.h"
Bubblesort::
Bubblesort(vector<int> &v)
{
	for (int i = 0; i < v.size() - 1; i++)
	{
		for (int j = 0; j < v.size() - 1 - i; j++)
		{
			if (v[j] > v[j + 1])
			{
				temp = v[j];
				v[j] = v[j + 1];
				v[j + 1] = temp;
			}
		}
	}
}

这之后,在主函数的源文件中,包含所编写的头文件即可。

#include"bubblesort.h"

这些所做的一切,头文件的声明,源文件的实现,对我们自己来说,其提供了代码的清晰性和可维护性。对别人来说,提供了一个接口可供其使用。
当然如果你想把这些都写在一起,这也是可以正常被编译的。

头文件的实质

在C++中,头文件是不被编译的。我们在实现时所使用的“#include”叫做编译预处理指令。
其可以简单理解为在源文件1.cpp中通过#include"1.h"语句,把1.h头文件中的代码在编译前添加到了1.cpp的头部。每个.cpp文件会被编译,生成一个.obj文件,然后所有的.obj文件链接起来你的可执行程序就算生成了。

在C++编程过程中,当项目很多,会造成代码量的最大和难以管理。在C++中分出了头(.h)文件和实现(.cpp)文件,可以使整个内容更清晰。

#pragma 指令

它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作。
#pragma指令对每个编译器给出了一个方法,在保持与C和C++语言完全兼容的情况下,给出主机或操作系统专有的特征。
依据定义,编译指示是机器或操作系统专有的,且对于每个编译器都是不同的。
其格式一般为:
#pragma para
举例message 参数,它能够在编译信息输出窗口中输出相应的信息,
这对于源代码信息的控制是非常重要的。其使用方法为:
‘#pragma message("消息文本")

当编译器遇到这条指令时就在编译输出窗口中将消息文本打印出来。

#ifdef

当我们在开发中,需要确定我们是否正确设置一些宏的时候,可以使用ifdef。其实这就类似于if条件语句,只是这是宏定义中的if形式。
假设我们希望判断自己有没有在源代码的什么地方定义了,MAX这个宏,
可以用下面的方法:
#ifdef MAX
#pragma message(“MAX is defined”)
#endif
我们定义了MAX这个宏以后,应用程序在编译时就会在编译输出窗口里显示"MAX is defined"。

static_assert关键字

这个关键字,用来做编译期间的断言,因此叫做静态断言。如果第一个参数常量表达式的值为真(true或者非零值),那么static_assert不做任何事情,就像它不存在一样,否则会产生一条编译错误,错误位置就是该static_assert语句所在行,错误提示就是第二个参数提示字符串。
使用static_assert,我们可以在编译期间发现更多的错误,用编译器来强制保证一些契约,并帮助我们改善编译信息的可读性,尤其是用于模板的时候。

template <class T>
class vector
{
static_assert(!std::is_same<bool, T>::value,
 "vector<bool> is abandoned in mystl"); 
 //如果vector参数有bool变量则提前报错
 ......
 }

https://www.zhihu.com/question/25436617/answer/202624758
https://www.cnblogs.com/fenghuan/p/4794514.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值