29

古い C++ プロジェクトを Visual Studio 6 から Visual Studio 2012 に移行しているときに、標準の Microsoft プラットフォーム ヘッダー内から奇妙な一連の警告に遭遇しました。

  • 警告 C4005: '__useHeader': マクロの再定義
  • 警告 C4005: '__on_failure': マクロの再定義

オンライン検索では、このエラーに遭遇した他の数人しか見つかりませんでした. 場合によっては、VS2012 を使用してレガシー DirectX コードをコンパイルしようとしている人がいましたが、私はそうしていません。他のケースでは、VS2012 を使用して (Update 1 の新しいオプションを使用して) Windows XP をターゲットにしようとしている人々でした - 私はそうしています。

DirectX の質問には、古い (Win8 より前の) バージョンの DirectX を使用してコンパイルしていることを知らせる警告が常に表示されるという回答がありました。

Windows XP に関する質問には回答がありませんでした。他の人は、問題を再現できないと単純に言いました。

私はそれを再現し、これに遭遇した他の誰かを助けるためにここに書いている原因を見つけました.

4

11 に答える 11

21

プロジェクトのプロパティに移動し、「プリプロセッサ定義」フィールドを見つけます。

デフォルトおよび追加された定義定数に加えて、マクロが表示されます。

%(PreprocessorDefinitions)

このマクロは、明らかに、コンパイラが提供する追加のプリプロセッサ定義をいくつか取り込みます。このマクロを導入した Visual Studio のバージョンはわかりませんが、Visual Studio 6 にはありませんでした。

Visual Studio 2012 では、このマクロはプロジェクトのプリプロセッサ定義フィールドに存在する必要があります。以前のバージョンの Visual Studio でも必要になる場合がありますが、これらはテストしていません。

このマクロが見つからない場合、上記のようなエラー メッセージが表示されます。

于 2013-01-16T17:12:49.277 に答える
13

アップデート:

最初に、この同じ質問に対するEdmundの回答を参照してください。試してみてください。それが機能する場合、素晴らしいです!そうでない場合は...次のことを試してください。

オリジナル:

この Web ページの「回避策」タブに記載されている回避策を使用してください。

http://connect.microsoft.com/VisualStudio/feedback/details/789965/resource-editor-warning-rc4005-on-toolset-visual-studio-2012-windows-xp-v110-xp

つまり、次を追加します。

#define _USING_V110_SDK71_ 1

...この警告の原因となるシステム ヘッダーを含むものを含めるに、.rc ファイルに直接挿入します。

于 2013-09-26T17:50:49.543 に答える
6

これはリソース コンパイラの警告です。解決策は簡単です。ソリューション エクスプローラーで .rc ファイルを右クリックし、[プロパティ] を選択します。Resources > General > Preprocessor Definitions に移動し、追加します。

%(PreprocessorDefinitions)
于 2013-09-12T13:59:08.707 に答える
4

私にとっては、別の解決策が機能しました。

プロジェクトのPropertiesConfiguration propertiesC/C++Generalで、このマクロを使用してフィールドAddition Include Directories path to SDK を変更しました。

$(WindowsSDK_IncludePath)

それ以前は、このフィールドには SDK v7.1 へのパスがあり、同じ警告がありました。

于 2016-03-16T11:13:18.893 に答える
1

VC++ 2003 で始まり、何年にもわたって段階的にアップグレードされたいくつかのプロジェクトでこの問題が発生しました。プロジェクト設定に%(PreprocessorDefinitions)はプリプロセッサ定義が含まれていましたが、いくつかの .cpp ファイルには含まれていませんでした (最も古いもの)。それらを「親またはプロジェクトのデフォルトから継承」に変更すると、警告がなくなりました。

于 2016-08-09T14:10:49.617 に答える
0

この回答は VS10 向けですが、VC++ ディレクトリ マクロで何が起こっているのかについていくつかの手がかりを提供する可能性があるため、興味深いものです。これらのステートメントがプロジェクト MyApp のヘッダー ファイルに追加されたときに警告が表示されました。

#ifndef NTDDI_WINXPSP3
#define NTDDI_WINXPSP3 0x05010300
#endif 
#ifndef NTDDI_VISTA
#define NTDDI_VISTA 0x06000000
#endif 
#ifndef NTDDI_VISTASP1
#define NTDDI_VISTASP1 0x06000100
#endif 
#ifndef NTDDI_WS08
#define NTDDI_WS08 0x06000100
#endif 

XPSP3 定義以外のすべてに対して、次のような警告が表示されます。

警告 RC4005: 'NTDDI_VISTASP1': 再定義 C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\include\sdkddkver.h.., MyApp

MyApp は WinDebug 32 ビルドであり、proj ファイルの X64 セクションに Windows7.1SDK が表示されていることに注意してください。

<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<PlatformToolset>Windows7.1SDK</PlatformToolset>

プリプロセッサ定義の継承された値は _VC80_UPGRADE=0x0600 でした。V100 に戻す前に SDK ツールセットを使用すると、SDK ライブラリは、ここに記載されているように、VC++ ディレクトリセクションのインクルード ディレクトリライブラリ ディレクトリでinherited_fromとして検出されました。 アップグレード、移行、またはツールセットの変更が組み合わされた結果、警告が生成されたようです。

編集:VS2017(MBCS)の無関係な問題は、使用することを選択しています

LoadCursorW(nullptr, IDC_ARROW)

LoadCursorA(...)WNDCLASSEXW 構造体のデフォルトの代わりに。考えられる解決策は、次のように再定義することです。

 #define IDC_ARROW           MAKEINTRESOURCEW(32512)

ここで、前の#undef手順を使用して警告を抑制することができます#define

#ifdef IDC_ARROW
#undef IDC_ARROW
#endif
#define IDC_ARROW           MAKEINTRESOURCEW(32512)
于 2016-12-12T13:23:17.530 に答える