首先,检查头文件,“在运行时”和“在编译时”没有什么不同,因为#include
在编译时与 any 一起执行#ifdef
。A#include
本质上是复制粘贴 .cpp 文件顶部的标题。Razvan Cojocaru 指出,您可以使用#ifdef
来检查天气_GLIBCXX_IOSTREAM
是否已定义。这是一个可以使用它的小例子:
class Flagger
{
typedef unsigned long ulong;
public:
Flagger (ulong flags = 0) : f(flags) { ; }
Flagger (const Flagger& cpy) : f(cpy.f) { ; }
void clear (ulong flags) { f &= ~flags; }
void set (ulong flags) { f |= flags; }
void toggle (ulong flags) { f ^= flags; }
bool get (ulong flags) { return f & flags; }
#ifdef _GLIBCXX_OSTREAM
friend std::ostream& operator << (std::ostream &out, const Flagger& f)
{ /* print it how you want it*/ }
#endif
private:
ulong f;
};
但是,这可能是一个坏主意,原因如下:
- 用户需要在包含 iostream 后包含上述头文件,否则编译器会删除该函数。
- 如果 iostream 库的创建者在任何时候决定更改 #define 名称,则该函数将被删除。同样,如果有人使用带有不同#define 标记的不同版本的iostream,则该函数将被删除。
- 在上面的示例中,仅包含自己的库并没有太大的不同。如果某个随机用户不使用该库,他们的程序的最终大小不会有太大的不同,并且功能根本不会改变。
所以基本上,是的,这是可能的,但不实用。尤其适合长期维护。好处不超过危险。只需自己包含有问题的库。
正如其他人在这里所说,如果我们知道您的最终结果是什么,那将会很有帮助。您计划使用它的地方很可能有更好的解决方案。