6

ソースコードにヘッダーが含まれているかどうかを知ることは可能ですか?

これは私が必要とするものの例です:

#include<iostream>
using namespace std;

int main()
{
    char headname[4];
    cout<<"Enter a header name : ";
    cin>>headname;

    #ifdef headname
        cout<<headname<<" Defined"<<endl;
    #else
        cout<<headname<<" Not defined"<<endl;
    #endif

    return 0;
}

たとえば、「iostream」と入力すると、出力は「iostream Defined」になります。

4

4 に答える 4

5

はい。ヘッダーは通常、次のようなインクルード ガードを使用します。

#ifndef MY_HEADER_INCLUDED
#define MY_HEADER_INCLUDED

// [...]

#endif

Gentoo Linux / GCC システムで、iostream ヘッダーを見ると、次のように表示されます。

#ifndef _GLIBCXX_IOSTREAM
#define _GLIBCXX_IOSTREAM 1

を確認できます_GLIBCXX_IOSTREAM。GCC を使用していない場合は、iostreamヘッダー ファイルを開いて、定義されている可能性のあるマクロを確認してください。

ヘッダーにcout属することも指摘する必要があるため、 (私の場合) が定義されていない場合、コードもコンパイルに失敗します。ただし、テストには使用できます。iostream_GLIBCXX_IOSTREAMprintf()

于 2013-10-20T18:13:40.887 に答える
0

まず、ヘッダーのチェック、「実行時」と「コンパイル時」は#include、コンパイル時に any とともに実行されるため、違いはありません#ifdef。基本的#includeに、.cpp ファイルの上部にあるヘッダーをコピーして貼り付けます。#ifdefRazvan 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;
};

ただし、これはおそらくいくつかの理由から悪い考えです。

  1. ユーザーは、iostream をインクルードした後に上記のヘッダーをインクルードする必要があります。そうしないと、コンパイラが関数を削除します。
  2. ある時点で iostream ライブラリの作成者が #define 名を変更することを決定した場合、関数は削除されます。同様に、別のバージョンの iostream を別の #define タグで使用している場合、関数は削除されます。
  3. 上記の例では、ライブラリを自分で含めるだけでもそれほど違いはありません。一部のランダムなユーザーがライブラリを使用しない場合、プログラムの最終的なサイズはそれほど変わらず、機能はまったく変更されません。

したがって、基本的には可能ですが、実用的ではありません。特に長期間のメンテナンスに。メリットが危険を上回ることはありません。問題のライブラリを自分で含めるだけです。

ここで他の人が述べたように、あなたの最終結果が何であるかを知っていれば助かります. これを使用する予定の場所には、おそらくより良い解決策があります。

于 2014-05-10T19:26:47.857 に答える