インテル® Advisor ユーザーガイド

advisor-annotate.h を追加した後に発生するコンパイルの問題への対応

このトピックは、主に 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_DECLAREANNOTATE_DEFINE#include "advisor-annotate.h" インクルード文のに定義します。

  1. アノテーションを含むほとんどのモジュールで #define ANNOTATE_DECLARE#include "advisor-annotate.h"に挿入します。これにより、advisor-annotate.h は外部関数を宣言し、windows.h (または等価な Linux* のファイル) はインクルードされません。そのため、オペレーティング・システムのスレッド・ヘッダー・ファイル (windows.h など) との型/シンボルの競合が回避されます。

  2. アノテーションをインクルードしない、または 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" 
...

問題が解決しない場合、サポートフォーラムなどでお問い合わせください。ヘルプとサポートについて」にリンクがあります。

関連情報