2017-11-09 14 views
0
私はこのような例のために、いくつかの矛盾プリプロセッサ関数定義を含む大規模なプロジェクトを持っている

再定義競合する複数のプリプロセッサ定義グローバル

1.H:

#define CONFLICTINGMACRO(a, b) {doSomething(a, b)} 

2.H:

#define CONFLICTINGMACRO(a, b, c) {doSomethingElse(a, b, c)} 

いくつかのファイルは両方のヘッダーをインポートしますが、間違った定義(最初に読み込まれたもの)を見つけます。

I(再)他のシンボルを定義し、このファイルには、コンパイラを経由して、プロジェクトのすべてのソースファイルにグローバルに追加され

redefinitions.hと呼ばれるファイル内のプロジェクトの(Linuxでは利用できません例えば、Windowsの機能と種類)フラグ:他の機能を迅速かつ簡単にデバッグするための

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -include redefinitions.h") 

(私は今、競合するマクロを必要としない)私はredefinitions.hに以下の行を追加してみました:

#ifdef CONFLICTINGMACRO 
    #undef CONFLICTINGMACRO 
#endif 
#define CONFLICTINGMACRO(...) {} 

残念ながら、これは違いはありません。私の最高の推測は、これは* .hファイルがロードされる順序と関係があるということです。

プロジェクト全体のプロジェクトのさまざまなヘッダーファイルで定義されているマクロをどのようにオーバーライドすることができますか?

+0

おそらく '1.h'と' 2.h'ファイルを編集することはできません。 – Smeeheey

+0

残念なことに、何千ものファイルに広がっているこれらの紛争の大多数は(なぜか、私はまだこの混乱によって幾分馬鹿げています...編集したり、編集用のスクリプトを書いたりするまでにはかなりの時間がかかります(もちろん、将来行わなければならないことです)。 –

+0

コンパイラにマクロ定義などの特定のマクロ定義を無視するように指示する方法はわかりません。 – Tsyvarev

答えて

2

簡単な方法はありません。ソースコードの編集や前処理を除外した場合、移植性をあきらめてgccを守っても、ソースコード自体を編集することはできません。 the referenceから:

-includeファイル

プロセスファイルかのように "の#include "ファイル""プライマリソースファイルの最初の行として登場。 (...)このように

、あなたのredefinition.hCONFLICTINGMACROを定義しようとする他のすべてのヘッダーの上に含まれます。同じことは-D-Uです。すべてのマクロの再定義は、最後に一般的に見られるようになります。このような振る舞いをオーバーライドするプリプロセッサオプションはありません。

代替ハックはすべて含まれるヘッダファイルのファイルツリー全体をコピーすることであろう(例えば、含める/ - > include_wrapper /)し、次の同じ内容にすべてのファイルを変更します。次に

#include_next __FILE__ 
#ifdef CONFLICTINGMACRO 
    #undef CONFLICTINGMACRO 
#endif 
#define CONFLICTINGMACRO(...) {} 

その前にincludeディレクトリ(include_wrapper /)を設定してください。このように、ラップされたヘッダーを含めるたびに基本的には#undefというマクロになります。もちろん、#include_nextはそれほど一般的ではないプリプロセッサ拡張であるので、移植性を犠牲にするつもりです。

+0

私は早くあなたの答えを見ただけでしたか?その間、私は定義文を編集するpyhon sriptを書き始めました。 Man ...矛盾するマクロがあるだけで十分ではありません。そのほとんどは、認識できないパターンに従ったフォーマットで複数の行にまたがっています。 作業する人このコードは、Visual C++でうまくコンパイルすると主張しています。私は、本当に意味ですか? とにかく、スクリプトに時間がかかり過ぎても、あなたの解決策を試してくれてありがとう。 –

関連する問題