Justin's Words

C++ 头文件

Refer to: Learn Cpp

直接上代码

三个文件源码如下:

add.h:

1
2
3
4
5
6
#ifndef ADD_H
#define ADD_H

int add(int x, int y);

#endif

add.cpp:

1
2
3
4
int add(int x, int y)
{
return x + y;
}

main.cpp:

1
2
3
4
5
6
7
8
9
#include <iostream>
#include "add.h"

int main()
{
using namespace std;
cout << "The sum of 3 and 4 is " << add(3, 4) << endl;
system("pause");
}

编译运行过程

enter image description here

常见问题

尖括号和双引号的区别

你可以看到 iostream 是使用尖括号进行引用的,而 add.h 是通过双引号进行引用,为什么呢?

这是因为 iostream 是编译器自带的头文件,尖括号的意思是告诉编译器到系统目录下查找这个头文件。而双引号则告诉编译器这个头文件是由我们自己提供的,这样编译器就会在当前文件夹下查找这个头文件,如果编译器在当前文件夹下找不到这个头文件,它就会查找编译器或 IDE 设置好的路径下是否包含该文件,还是找不到的话编译器就会查找系统目录。

规则是:使用尖括号包含编译器自带的头文件,使用双括号包含其他头文件。

为什么 iostream 没有一个 .h 后缀?

最直接的回答:因为 iostream.hiostream 压根就不是同一个头文件!不过要解释开来就都是历史遗留问题了。

老版本的 C++ 使用 iostream.h,后来 C++ 被 ANSI 委员会标准化后把 iostream.h 的所有方法都迁移到 std 命名空间里,但这样在此之前写的代码不就不能被正确编译了吗?于是他们想到了用 iostream,这些新的头文件都被包含在 std 命名空间内,这样旧的代码就不必重写了。

规则是:如果一个库有不用 .h 后缀的版本存在,那就通过 std 命名空间访问它,但如果这个库没有不用 .h 后缀的版本,那你就得自己创建头部,同时使用 .h 版本。

引用其他路径的头文件

如下代码:

1
2
#include "headers/myHeader.h"
#include "../moreHeaders/myOtherHeader.h"

能不能把函数定义到一个头文件内

可以。但强烈建议不这么做,或者说你不应该这么做。

一些 mention

  • Always include header guards.
  • Do not declare variables in header files unless they are constants. Header files should generally only be used for declarations.
  • Do not define functions in header files.
  • Each header file should have a specific job, and be as independent as possible. For example, you might put all your declarations related to functionality A in A.h and all your declarations related to functionality B in B.h. That way if you only care about A later, you can just include A.h and not get any of the stuff related to B.
  • Give your header files the same name as the source files they’re associated with (e.g. grades.h goes with grades.cpp).
  • Try to minimize the number of other header files you #include in your header files. Only #include what is necessary. Do not #include .cpp files.