例如,我有两个 header.h 文件位于两个不同的目录 include1 和 include2 。 我的源代码文件使用常规包含,但没有指定确切的位置,如下所示:
#include "header.h"
在项目配置中,我将 include1 和 include2 文件夹设置为其他包含目录列表。
问题是当我构建项目时,每次都会选择 include1 文件夹,无论我在附加包含列表中定义它们的顺序如何。
有没有办法强制执行搜索顺序,如果我想要一个特定的文件夹或特定的头文件,而不是另一个,如果它们都有相同的文件名?
答案 0 :(得分:9)
包含顺序(由MS作为documented)是:
编译器按以下顺序搜索目录:
1.包含源文件的目录 2.使用/ I选项指定的目录,按照CL遇到它们的顺序 3. INCLUDE环境变量中指定的目录。
所以它实际上取决于声明包含目录的位置。如果它们都使用/ I选项指定(在配置属性> C / C ++> General>附加包含目录下的GUI中),则指定的顺序是搜索的顺序。如果目录位于INCLUDE环境变量中(在Configuration Properties> VC ++目录下的GUI中),则它取决于它们声明的位置。如果它属于属性表,那么您必须不继承它们并按所需顺序自己声明它们(和其他继承的目录)。
答案 1 :(得分:0)
我认为你的问题很难解决。我怀疑header.h包含在文件夹include1中的文件中。
这意味着标准C包含路径
所以要解决这个问题,我们需要能够(以某种方式)阻止规则1被解雇。
如果您不关心修改源代码,使用#include "projecta/header.h"
和#include "projectb/header.h"
是实现此目的的常用方法。
在您的情况下,您要确保(包括include2。)
您可以申请的方法。
如果可修改早期代码(.c / .cpp文件),则确保满足#include "include2/header.h" - which should also set up so all requirements for
include1 / header.h`。
如果include1/header.h
有一个包含保护(#if ! defined( H_HEADER_H)
),那么在命令行(/DH_HEADER_H
)定义它,所以它不包括在内 - 这是一个黑暗的刺,如该文件无法实现其目的。
编写文本修改脚本(sed?)以将“header.h”修改为“include2 / header.h” - 这可确保源中的所有实例选择您的版本。这不是你的规范,但可以设想为保持源不变,因为这将是一个预编译步骤。
保证更改包含顺序的目标可以通过创建2个单独的项目来实现 - 一个使用include1/header.h
而原始代码不变。然后提供include2/header.h
作为其界面,以某种方式进行修改。