你能用#define来改变#include吗?

Tor*_*yst 5 c++ include c-preprocessor

是否有可能在使用过程中更改包含的库#include <foo>或更改#include "foo"不同的库,以便它可以作为一个不同的库,例如#include <bar>?我有一个库#include只在一个上下文中不使用当前语句,但在其他地方工作正常,所以我不想直接更改它.是否有可能#define用来解决这个问题?

zwo*_*wol 8

有两种方法可以做到这一点.更简单,更明显的方式:

#define INCLUDE_FOO

// ...

#ifdef INCLUDE_FOO
#include <foo>
#else
#include <bar>
#endif
Run Code Online (Sandbox Code Playgroud)

更短但更精细的方式:

#define FOO_HEADER "foo"

// ...

#include FOO_HEADER
Run Code Online (Sandbox Code Playgroud)

你必须要小心,如果你使用第二种方法,因为C标准不完全定义的行为,#include其次什么是也不"..."<...>.它说"任何不是......的东西"是完全宏扩展的,应用行的特殊标记化规则#include(例如<foo.h>是五个标记,而不是一个),然后实现定义的实现.

如果完全宏扩展的结果是单个字符串文字标记,那么我所知道的所有实现都会按照您的预期执行,即它们会将其视为#include "..."已写入,其中...字符串文字的内容.(但是,字符串文字中反斜杠的行为可能与您期望的不同.仅对目录分隔符使用正斜杠;这在Windows和其他地方都可靠地工作.)

如果完全宏扩展的结果是其他任何东西,则行为是不可预测的,并且不仅在实现之间,而且在相同实现的点发布之间也不同.避免.

附录:如果#include一行以两种典型格式之一开头,那么......

#include "foo"
#include <foo>
Run Code Online (Sandbox Code Playgroud)

......然后宏观扩张不会发生,也不会被迫发生.这意味着你可能希望避免因问题而改变第三方标题.