web-dev-qa-db-ja.com

マクロの再定義を防ぐ方法

私のプロジェクトでしばらく働いた後、この警告が表示され始めます:

2>Game.cpp
2>c:\program files\Microsoft sdks\windows\v6.0a\include\windef.h(126) : warning C4005: 'APIENTRY' : redefinición de macro
2>        c:\users\ferran\directo\gameprojects\dev-libs\glfw\include\glfw.h(72) : vea la definición anterior de 'APIENTRY'
2>c:\program files\Microsoft sdks\windows\v6.0a\include\wingdi.h(23) : warning C4005: 'WINGDIAPI' : redefinición de macro
2>        c:\users\ferran\directo\gameprojects\dev-libs\glfw\include\glfw.h(88) : vea la definición anterior de 'WINGDIAPI'

これらのファイルはどれも自分のものではないので、解決するインクルードファイルの順序の問題だと確信しています。私の質問は、これを防止する一般的な方法があるか、またはこのメッセージを回避するためにどのファイルを並べ替える必要があるかを見つける方法があるかどうかです。

15
Killrazor

エラーメッセージ自体が間違った順序を示しています。 windef.hwingdi.hglfw.hで定義されたシンボルを再定義していると言っています。

Windowsインクルードファイルの後にglfw.hを置きます。

21
Mark Ransom

Microsoftは通常、ヘッダーを独立型に設計していません。ほとんどのWindows指向のヘッダーでは、最初に<windows.h>をインクルードする必要があります。すべてのヘッダーのマザーへの依存関係を除いて、通常は特定のヘッダーの依存関係はないので、最初に<windows.h>を含めることで問題は発生しません。

問題はファイルGame.cppにあります。 glfw.hの前にwindows.hを含めるようにしてください。 glfw.hにはガードがあり、その警告を防止します。

#ifndef APIENTRY
 #ifdef _WIN32
  #define APIENTRY __stdcall
 #else
  #define APIENTRY
 #endif
 #define GL_APIENTRY_DEFINED
#endif // APIENTRY
7
tibur

残念ながら、または幸い、そうではありません。それを自動化するようなツールはありません。それらのヘッダーファイルのコードを読み、何が起こっているのかを把握して、適切なアクションを実行する必要があります。

あなたができる最も多くは

  1. ifdef または if defined(...)またはif !defined(...) プリプロセッサコンストラクトを使用してマクロが定義されているかどうかを確認します。
  2. undef を使用してマクロの定義を解除します。

ANSI Cのみがマクロの再定義をエラーと見なします。

2
user405725

これは、Visual Studioのプリコンパイルヘッダーが原因である可能性があります。すべての標準ヘッダーとMicrosoftヘッダーが前に含まれていることを確認してください。 Microsoftヘッダーを.hファイルに含めないでください(glfw.hにwindef.hとwingdi.hが含まれているようです)。すべてのヘッダーに副作用がないことを確認してください。その後、問題は解消されます。それを引き起こしているものを正確に把握することは、一般的に非常に困難です。

1
verisimilidude