まず、ヘッダーのチェック、「実行時」と「コンパイル時」は#include
、コンパイル時に any とともに実行されるため、違いはありません#ifdef
。基本的#include
に、.cpp ファイルの上部にあるヘッダーをコピーして貼り付けます。#ifdef
Razvan Cojocaru は、 を使用して天気_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 名を変更することを決定した場合、関数は削除されます。同様に、別のバージョンの iostream を別の #define タグで使用している場合、関数は削除されます。
- 上記の例では、ライブラリを自分で含めるだけでもそれほど違いはありません。一部のランダムなユーザーがライブラリを使用しない場合、プログラムの最終的なサイズはそれほど変わらず、機能はまったく変更されません。
したがって、基本的には可能ですが、実用的ではありません。特に長期間のメンテナンスに。メリットが危険を上回ることはありません。問題のライブラリを自分で含めるだけです。
ここで他の人が述べたように、あなたの最終結果が何であるかを知っていれば助かります. これを使用する予定の場所には、おそらくより良い解決策があります。