4

C ++ヘッダーがどこからインクルードされたかをプログラムで検出(および印刷)することは可能ですか?

私は次のようなヘッダーを持っています:

// DeprecatedHeader.h
__pragma( message ("DeprecatedHeader.h is deprecated - include NewHeader.h instead.") )
#include "NewHeader.h"

ご覧のとおり、コンパイラはMSVCですが、ラップするマクロがあります。GCCは大歓迎ですが、不可能な場合は、Windowsだけで「トリック」を有効にします。

しかし、私が探しているのは、次のような出力です。

"AnyOtherFile.cpp was including DeprecatedHeader.h, please include NewHeader.h instead."

編集:私がこれを望む理由を明確にするために:コンパイラがスローする警告はすでに大いに役立っています:コードは壊れていませんが、インクルードを変​​更するように人々を促します。問題:別のヘッダーを介してこのヘッダーをプルできるため、間違った「男」のせいになる可能性があります。私の目的は、コンパイルユニットではなく、誤ったヘッダーのせいにすることでした。

4

3 に答える 3

2

gcc -E完全にコンパイルされた( 、CL.EXE /Eまたは何でも)ではなく、前処理されたソースコードを生成するオプションを使用してコンパイラを実行できます。結果のコードには、コードの各スニペットがどこから来たかのタグ付けが含まれます。

于 2012-11-22T09:55:34.897 に答える
1

この機能を追求する価値はないと思いますが、ここに解決策があります。

各ヘッダー ファイルの上に、非推奨のヘッダーをチェックした後、他のファイルを含める前に、次のように記述します。

#undef INCLUDING_FILE
#define INCLUDING_FILE "file_name.h"

.hこれは、文字列にファイル名を含めて、各ファイルに対してこれを書き込む簡単な bash スクリプトで実行できます。

したがって、ヘッダーは次のようになります (gcc を使用):

通常のヘッダー:

#undef INCLUDING_FILE
#define INCLUDING_FILE "normal.h"

#include "deprecated.h"

非推奨のヘッダー:

#ifdef INCLUDING_FILE
# pragma message "Internal bug: " INCLUDING_FILE " included " __FILE__ " which is deprecated"
#else
# pragma message "Note: you shouldn't included " __FILE__ " which is deprecated"
#endif

#undef INCLUDING_FILE
#define INCLUDING_FILE "normal.h"

#include "others.h"
于 2012-11-23T12:39:45.347 に答える