在C或c++中包含头文件的正确方法

Proper way to include headers in C or C++

本文关键字:方法 文件 包含头 c++      更新时间:2023-10-16

我刚刚发现我一直做错了。我没有使用任何ide,只使用gcc。我已经开始使用makefile来编译我的大型项目。

大多数时候文件结构是这样的

├── makefile
└── src
    ├── folder1
    │   ├── header1.cpp
    │   └── header1.h
    ├── folder2
    │   ├── header2.cpp
    │   └── header2.h
    └── main.cpp

header2.cpp上,当我包含header1.h时,我这样做

文件 header2.cpp

#include "../folder1/header1.h"

这是我从另一个文件夹包含其他文件的方式。我想我做错了。我看到的大多数教程都使用Ide,他们没有这样包含它。

有些像这样包含

#include "folder1/header1.h"

或者其他人把它放在一个文件夹里,比如headers/

然后像这样包含它。

#include "header1.h"
有谁能给我指路吗?我如何做到这一点。我一直在做这件事,包括我猜。

我不想包含这样的文件

 #include "../../../../sofarfolder1/header1.h"

谢谢。每次看到我的代码我都想吐。

如果您不想使用../,您可以使用-Idir标志告诉GCC在目录dir中查找头文件。

更多信息:https://gcc.gnu.org/onlinedocs/cpp/Search-Path.html

https://gcc.gnu.org/onlinedocs/gcc/Directory-Options.html

在您的makefile中,您可以使用-I../../../sofardirectory

调用gcc

这样,它将在该目录中查找您包含的头文件。

使用编译器标志来指定额外的包含目录的一个不寻常的替代方法是使用C预处理器为包含文件路径创建定义的常量。

例如,如果您有一个包含文件,其相对路径为#include "../../stuff/lib1/thing1.h",则可以执行如下操作:

#define THING1_H_PATH  "../../stuff/lib1/thing1.h"
  // ...
#include THING1_H_PATH

gcc C预处理器文档,第1.3.2节中的C预处理器,#include指令是这样说的:

#include else

这个变体称为computed #include。任何"#include"指令谁的论点不符合上述两种形式是一个计算包含。检查文本中的其他内容是否为宏调用,它们被展开(参见1.4节宏)。当这一切完成后,结果必须符合上述两种变体之一,特别是展开的文本最后必须用引号或角括起来括号。

这个特性允许你定义一个宏来控制稍后在程序中使用的文件名。一个应用程序这是为了允许站点特定的配置文件为您的程序指定要使用的系统包含文件的名称。这有助于将程序移植到不同的操作系统必要的系统头文件在不同的地方。

我如何处理头文件取决于它们是否将被安装(与库一起)。

我将保留在项目源文件夹中的私有头文件:

├── Makefile
└── src
    ├── header1.cpp
    └── header1.h
    ├── header2.cpp
    └── header2.h
    └── main.cpp

然后像这样包含它们:

#include "header1.h"

公共头文件(待安装)我通常像这样放在项目子文件夹中:

├── Makefile
└── src
    ├── project
    │   ├── header1.h
    │   └── header2.h
    └── header1.cpp
    └── header2.cpp
    └── main.cpp

我把它们包括在:

#include <project/header1.h>

为了定位公共头文件,你需要设置一个编译器标志。对于GCC,即-I

g++ -Isrc ... etc ...

当头文件被安装后,它们会被放到/usr/include:

 ── usr
    └── include
        ├── project
        │   ├── header1.h
        │   └── header2.h

客户端软件将以同样的方式包含它们:

#include <project/header1.h>

但是它们会提供不同的标志设置来找到它们:

g++ -I/usr/include ... etc ...