当我在个人C和C++项目上工作时,我通常把file.hfile.cpp放在同一个目录中,然后file.cpp可以用#include "file.h"指令引用file.h.

然而,通常会发现库和其他类型的项目(如linux内核和freeRTOS),其中所有.h个文件都放在一个include/目录中,而.cpp个文件保留在另一个目录中.在这些项目中,.h个文件也包含在#include "file.h"个文件中,而不是我希望的#include "include/file.h"个文件中.

我对这一切有几个问题:

  1. 这种文件 struct 组织的优点是什么?
  2. 为什么#include "file.h"中包含include/中的.h个文件,而不是#include "include/file.h"个?我知道真正的诀窍是在一些Makefile中,但是这样做真的比(用代码)清楚地说明我们要包含的文件实际上在include/目录中更好吗?

推荐答案

这样做的主要原因是编译后的库需要标头,以便最终用户使用.按照惯例,include目录的内容是公开供公众使用的标题.源目录可能有内部使用的标题,但这些标题意味着要与编译的库一起分发.

因此,在使用库时,可以链接到二进制文件,并将库的include目录添加到构建系统的头路径中.类似地,如果将编译后的库安装到一个集中的位置,则可以判断哪些文件需要复制到中心位置(编译后的二进制文件和include目录),哪些文件不需要(源目录等等).

C++相关问答推荐

如何通过Zephyr(Devicetree)在PR Pico上设置UTE 1?

字符数组,字符指针,在一种情况下工作,但在另一种情况下不工作?

Mise()在虚拟内存中做什么?

减法运算结果的平方的最快方法?

有没有可能我不能打印?(C,流程)

当输入负数时,排序算法存在问题

如何使用[BTStack]BLE发送大型(>;2kb)信息包

限制不同类型的限定符

如何识别Linux中USB集线器(根)和连接到集线器(根设备)的设备(子设备)?

如何仅使用软件重新初始化STM32微控制器中的USB枚举?

循环中的静态变量与块中的变量和循环

Linux分段故障(核心转储)

Valgrind用net_pton()抱怨

为什么我的旧式&q;函数在传递浮点数时会打印2?

Linux Posix消息队列

在列表中查找素数

C 和 C++ 标准如何告诉您如何处理它们未涵盖的情况?

10 个字节对于这个 C 程序返回后跳行的能力有什么意义

使用邻接表创建图

C 预处理器中的标记分隔符列表