Tor*_*yst 5 c++ include c-preprocessor
是否有可能在使用过程中更改包含的库#include <foo>或更改#include "foo"不同的库,以便它可以作为一个不同的库,例如#include <bar>?我有一个库#include只在一个上下文中不使用当前语句,但在其他地方工作正常,所以我不想直接更改它.是否有可能#define用来解决这个问题?
有两种方法可以做到这一点.更简单,更明显的方式:
#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)
......然后宏观扩张不会发生,也不会被迫发生.这意味着你可能希望避免因问题而改变第三方标题.
| 归档时间: |
|
| 查看次数: |
732 次 |
| 最近记录: |