在C或c++中包含头文件的正确方法
Proper way to include headers in C or C++
我刚刚发现我一直做错了。我没有使用任何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
这样,它将在该目录中查找您包含的头文件。
使用编译器标志来指定额外的包含目录的一个不寻常的替代方法是使用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 ...
- 如何使用curlpp通过POST方法上传文件和json数据
- 一种在C++中读取TXT配置文件的简单方法
- 在 cpp 文件中隐藏采用模板参数引用的方法
- 在C++中包含原型文件的正确方法是什么?
- 通过比较C++中的行在 txt 文件中搜索的最简单方法是什么?
- 不带预处理器的调用方法/文件的文件名/行号
- 引用文件的适当方法是什么?
- 在文件中写入而不是在 c++ 中使用 "<<" 的替代方法?
- 查找定义我的 C/C++ 函数/宏的文件比'grep'更简单的方法
- 读取大文件(>2GB)(文本文件包含以太网数据)并通过不同参数随机访问数据的最佳方法是什么?
- 在C++中创建文件夹选取器对话框的最简单方法是什么?
- C++:std::ofstream 方法 open() 在第二次迭代时擦除打开的 ifstream 文件
- 如何使用 C/C++ 和 system() 系统调用以外的其他方法在 Linux 中获取文件功能?
- 创建进行生产构建并创建调试信息的C++生成文件的最佳方法?
- 是否有正确的方法对生成文件中的对象文件使用模板命令?(C++)
- 将位字符串转储到二进制文件的最佳方法是什么
- 在目录中查找所有.cpp.h文件(include,src等)的传统方法
- 通过boost asio iostream下载大文件的最快方法是什么?
- LNK2019 在文件中调用静态成员的方法时出错.cpp
- 在 *.cpp 文件中实现的 c++ 函数/方法永远不会内联扩展吗?