如何在 gcc 中的当前路径下排除标头

How to exclude header under current path in gcc

本文关键字:排除 当前路径 gcc      更新时间:2023-10-16

假设我有两个目录producttest

./test
./test/test_product.cpp
./test/foo.h
./product
./product/product.cpp
./product/product.h
./product/foo.h

product.cpp包括foo.h

#include "foo.h"

默认行为是包含/product/foo.h 。但是,我想在/product/product.cpp中包含/test/foo.h,而无需对产品目录进行任何修改。有什么办法可以做到这一点吗?多谢!

您可以使用 -I 选项添加 GCC 预处理器用于查找头文件的搜索路径,然后您可以在包含文件时使用尖括号,然后预处理器应在与源文件相同的目录中查找文件。

换句话说,添加例如 -Itesttest目录添加到包含文件搜索路径。然后改用#include <foo.h>。当您想改用product/foo.h时,只需删除-Itest选项并添加-Iproduct即可。


还有另一种方式,涉及条件编译和兰亭提出的解决方案。

你可以有例如

#ifdef TEST
# include "../test/foo.h"
#else
# include "foo.h"
#endif

然后,要使用test/foo.h构建,您定义了宏TEST,这可以使用-D选项在命令行上完成:

$ gcc -DTEST ...

要使用product/foo.h只需删除该选项,以便不再定义TEST

您可以自由地为包含中的标头添加完整路径和相对路径。

#include "../test/foo.h"

例如,会工作

看看这些关于如何以及何时使用包括形式的讨论:相对路径(例如"../include/header.h"作为标题?和如何正确使用 #include 指令?

您可以通过在 #include 下提供其路径来在文件中包含标头。 前任。 #include".h 文件的路径"

您可以使用标头保护来存档,假设两个文件具有不同的标头保护,您可以在 make 文件的标志列表中添加 -D(您不需要的任何文件的标头保护)。