在C或C ++中包含标头的正确方法

时间:2015-10-11 23:03:26

标签: c++ c makefile

我刚刚发现我一直在做这个错误。我没有使用任何ide,只使用gcc。我也开始使用makefile编译我的大项目。

大部分时间文件结构都是这个

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

header2.cpp上,当我加入header1.h时,我会这样做

file header2.cpp

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

这是我如何包含其他文件夹中的其他文件。 我想我做错了。我观看的大部分教程都使用了Ide,它们并没有像那样包含它。

有些像这样包含它

#include "folder1/header1.h"

或其他人将其放在像headers/

这样的文件夹中

然后像这样包括它。

#include "header1.h"

任何人都可以指导我。我该如何实现这一目标。我一直这么做,包括我猜。

我不想包含这样的文件

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

感谢。每当我看到我的代码时,它都会让我呕吐。

4 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:5)

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

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

调用gcc

这样,它会在该目录中查找您包含的标题。

答案 2 :(得分:1)

我如何处理标题取决于它们是否将被安装(与库一样)。

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

├── 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 ...

答案 3 :(得分:1)

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

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

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

gcc C预处理器文档The C Preprocessor in section 1.3.2, The #include Directive有这样的说法:

  

#include其他任何东西

     

此变体称为计算#include。任何`#include&#39;指示   其论点不符合上述两种形式   是计算包含。其他任何内容都会检查宏   呼叫,这些呼叫被扩展(见section 1.4 Macros)。完成后,   结果必须符合以上两种变体之一 - 特别是,   扩展文本最后必须用引号或角度包围   括号。

     

此功能允许您定义控制的宏   文件名将在程序的稍后时间点使用。一个应用程序   这是为了允许您的特定于站点的配置文件   程序,用于指定系统名称,包括要使用的文件。   这有助于将程序移植到各种操作系统中   哪些必要的系统头文件在不同的地方找到。