インテル® Advisor ユーザーガイド
このトピックは、主に Windows* システムに適用されます。Linux* システム上でも同様のエラーが発生する可能性があります。
Windows* システムでは、advisor-annotate.h ヘッダーファイルはいくつかの型と関数を定義するため windows.h をインクルードします。その結果、特定の状況では advisor-annotate.h をインクルードすると、コンパイルエラーが発生する可能性があります。例えば、UINT 型で次のような競合が発生します。
error C2371: ‘UINT' : redefinition; different basic types (エラー C2371: ‘UINT' 再定義: 異なる基本型)
Linux* システムでは、オペレーティング・システムのスレッド化ソフトウェア向けの異なるヘッダーファイルを使用する際に、非常に特殊な状況下で同様の問題が発生する可能性があります。
この問題を解決するには、宣言/定義アプローチを使用します。このアプローチでは、advisor-annotate.h の使用は 1 つを除いてすべて宣言のセットを生成し、windows.h は単一の実装モジュールでのみ必要です。すべてのケースで、次のように #define を使用して ANNOTATE_DECLARE か ANNOTATE_DEFINE を #include "advisor-annotate.h" インクルード文の前に定義します。
アノテーションを含むほとんどのモジュールで #define ANNOTATE_DECLARE を #include "advisor-annotate.h" の前に挿入します。これにより、advisor-annotate.h は外部関数を宣言し、windows.h (または等価な Linux* のファイル) はインクルードされません。そのため、オペレーティング・システムのスレッド・ヘッダー・ファイル (windows.h など) との型/シンボルの競合が回避されます。
アノテーションをインクルードしない、または windows.h との型/シンボルの競合がない単一のモジュールでは、#define ANNOTATE_DEFINE を #include "advisor-annotate.h" の前に挿入します。これにより、advisor-annotate.h は、外部参照を解決するグローバル関数を定義し、#include "advisor-annotate.h" のみがオペレーティング・システムのスレッド化ヘッダーファイル windows.h (または等価な Linux* のファイル) を参照します。そうでなければ、この 2 行の定義は、空の .cpp ファイルに配置できます。
これを行う 1 つの方法として、次の empty.cpp のように、プロジェクトにこの 2 行の定義のみを含む .cpp を追加します。
Windows* システムの例:
// ファイル foo.cpp/.h: ... // アノテーションを含むすべてのモジュールで #define ANNOTATE_DECLARE を // #include "advisor-annotate.h" の前に挿入します。これにより、 // 型/シンボルの競合を回避するため windows.h がインクルードされなくなります。 #define ANNOTATE_DECLARE #include "advisor-annotate.h" ... // アノテーションを使用します。 ANNOTATE_SITE_BEGIN(MySite1) ... ANNOTATE_SITE_END() ...
// ファイル empty.cpp: // 1 つのモジュールでのみ、#define ANNOTATE_DEFINE を // #include "advisor-annotate.h" の前に挿入します。 // この実装ファイル (.cpp/.cxx) で windows.h がインクルードされ、サポートルーチンは // グローバルルーチンとして定義され、各種アノテーションから呼び出されます。 #define ANNOTATE_DEFINE #include "advisor-annotate.h" ...
問題が解決しない場合、サポートフォーラムなどでお問い合わせください。「ヘルプとサポートについて」にリンクがあります。