C++ 您可以使用#define更改#include吗?

C++ 您可以使用#define更改#include吗?,c++,include,c-preprocessor,C++,Include,C Preprocessor,是否可以将使用#include或#include“foo”包含的库在预加载过程中更改为不同的库,以便将其改为另一个库,例如#include?我有一个库,它不在一个上下文中使用当前的#include语句,但在其他地方可以正常工作,所以我不想直接更改它。是否可以使用#define来解决此问题?基本上,在您的cpp文件中,您可以定义一个变量来切换包含文件的行为: 所以在a.cpp中 #define BAR #include "myHeader.h" 在“myheader.h”中: #ifdef条 #

是否可以将使用
#include
#include“foo”
包含的库在预加载过程中更改为不同的库,以便将其改为另一个库,例如
#include
?我有一个库,它不在一个上下文中使用当前的
#include
语句,但在其他地方可以正常工作,所以我不想直接更改它。是否可以使用
#define
来解决此问题?

基本上,在您的cpp文件中,您可以定义一个变量来切换包含文件的行为:

所以在a.cpp中

#define BAR
#include "myHeader.h"
在“myheader.h”中:

#ifdef条
#包括
#否则
#包括
#恩迪夫

有一篇很好的文章介绍了使用预处理器宏切换行为的其他方法。有两种方法。更简单、更明显的方法是:

#define INCLUDE_FOO

// ...

#ifdef INCLUDE_FOO
#include <foo>
#else
#include <bar>
#endif
如果使用第二种方法,您必须小心,因为C标准没有完全定义
#include
后跟任何不是
“…”
的行为。它表示“非…”的任何内容都是完全宏扩展的,不适用于
#include
行的特殊标记化规则(例如
是五个标记,而不是一个) 然后,一些实现定义的事情发生了

如果完整宏扩展的结果是单个字符串文字标记,那么我所知道的所有实现都将实现您所期望的,也就是说,它们会将其视为包含已编写的“…”,其中,
是字符串文字的内容。(但是,字符串文字中反斜杠的行为可能与您预期的不一样。仅对目录分隔符使用正斜杠;这在Windows和其他地方都能可靠地工作。)

如果完整宏扩展的结果是其他结果,则行为是不可预测的,并且不仅在实现之间存在差异,而且在同一实现的点版本之间也存在差异。避免

附录:如果一个
#include
行是以以下两种典型格式之一开始编写的

#include "foo"
#include <foo>
#包括“foo”
#包括

。。。这样,宏扩展就不会发生,也不能被迫发生。这意味着您可能在避免更改第三方标题时遇到了麻烦。

#ifdef foo#define bar#ifndef foo#define foobar#endifyes,您可以先执行#ifdef SOMEVAR,然后执行#include#else#include您也可以执行#定义文件名“某物”(定义基于其他宏时)然后是
#include FILENAME
以包含不同的文件。这很有效。非常感谢。只是想知道,有没有一种方法可以做到这一点,而不必改变图书馆?我不这么认为,我只是绞尽脑汁想看看你是否可以取消定义,我想不是因为你控制了头文件的行为,所以该文件必须知道如何切换它需要包含的头文件。我在想你是否可以取消定义,但这是不允许的,即使是,它也不会改变它包含的内容,因此,我认为如果不修改标题,你就无法做到这一点。这是一种有趣的做事方式。我想您可以添加一些
#ifndef
逻辑,使它稍微好一点,这样至少为
#include
定义了一些内容。谢谢你的主意。
#define FOO_HEADER "foo"

// ...

#include FOO_HEADER
#include "foo"
#include <foo>