6

この問題の適切なタイトルを思い付くのは難しい。ともかく...

私は現在、 SDLでゲームのGUIに取り組んでいます。私はソフトウェアの描画を終了し、奇妙なエラーが発生したときにそのOpenGL部分で開始する途中でした。「SDL/SDL_opengl.h」ヘッダーを含めてコンパイルしました。「エラーC2039:'DrawTextW':は'GameLib :: FontHandler'のメンバーではありません」をスローします。これは単純なエラーですが、DrawTextWと呼ばれるものはなく、FontHandler::DrawTextのみがあります。DrawTextWを検索し、ヘッダー「WinUser.h」の#define呼び出しで見つけました。

//WinUser.h
#define DrawText DrawTextW

どうやらそれは私のDrawTextをDrawTextWに置き換えます!どうすればそのようにコードにこぼれるのを防ぐことができますか?

自分の関数の名前を変更するのは些細なことですが、このような名前の競合はかなり危険なように思われるので、それらをすべて一緒に回避する方法を本当に知りたいと思います。

乾杯!

4

4 に答える 4

11

いくつかのオプションがありますが、どれも最悪です。

  • #undef DrawText独自のコードを追加する
  • を含めないでくださいwindows.h。別のライブラリに含まれている場合は、直接含めないでください。代わりに、別の .cpp ファイルに含めます。これにより、独自のラッパー関数をヘッダーに公開できます。
  • 独自の名前を変更しますDrawText

可能であれば、私は通常、中間のオプションを選択します。windows.h他の無数の方法で動作が悪いため (たとえば、Microsoft の独自の C++ 拡張機能を有効にしない限り、実際にはコンパイルされません)、疫病のように単純に回避します。私がそれを助けることができれば、それは私のファイルに含まれません。代わりに、別の .cpp ファイルを作成して、それを格納し、必要な機能を公開します。

また、connect.microsoft.com でバグやフィードバックとして送信してください。Windows.h は犯罪的な設計のヘッダーであり、人々が Microsoft の注意を引くことができれば、いつか修正される可能性が (わずかに) あります。

良いニュースは、これがこれほど悪い振る舞いをするwindows.h唯一のヘッダーだということです。他のヘッダーは通常、マクロの前にライブラリ固有の名前を付けて名前の競合を回避しようとし、一般的な名前のマ​​クロを作成しないようにし、必要以上のマクロを使用しないようにします。

于 2009-07-03T20:22:09.540 に答える
5

#includeこれは、 ingの不幸な副作用です<windows.h>。プログラムのどこでも実際にWindowsを使用していないと仮定すると、次の直後はDrawText()完全に安全です。#undef

// wherever you #include <windows.h>, or any other windows header
#include <windows.h>
#undef DrawText
于 2009-07-03T19:56:24.667 に答える
4

この問題を回避する一般的な方法はありません。プリプロセッサを使用してヘッダーファイルを#includeすると、好きな名前を再定義でき、それについてできることは何もありません。名前を#undefすることはできますが、それは名前が最初に#definedであることがわかっていることを前提としています。

于 2009-07-03T19:56:29.130 に答える
0

#undef必要のないシンボルだけ。ただしwindows.h、SDL をインクルードする前に、必ずインクルードしてこれを実行してください。

#include <windows.h>
#undef DrawText

#include <SDL/SDL_opengl.h>
于 2009-07-03T20:04:17.087 に答える