4

Windows では、次の行の後に

#include <windows.h>

多くのシンボルがグローバル名前空間で定義されます。たとえば、Polygon定義されます。このシンボルを使用して、次のようにカスタム クラスを定義する便利な方法はありますか?

class Polygon {
    ...
};

class Polygon独自の名前空間を配置することは、使用するたびにその名前空間で明示的に修飾する必要があることを意味しますか? 言い換えれば、特定の定義を非表示またはマスクする方法はありますwindows.hか? または、他の実用的な回避策はありますか?

私は考えました:

#define Polygon Polygon_windows
#include <windows.h>
#undef Polygon

しかし、これはかなり醜いようです。

もちろん、使用することはできませんnamespace windows { #include <windows.h> }

4

2 に答える 2

3

このようなマクロに対する唯一の実際の防御策は、定義を分離し、衝突する名前を持つクラスの使用を実装ファイルに直接記述することです。

<windows.h>これは、意地悪なマクロ定義に関する絶対的な最悪の 1 つであり、何千ものマクロ定義があることに注意してください…

ちょうど昨日、私はと Microsoft 独自のコードとの間<windows.h>、またはより正確には との間で、さらに別のそのような競合に気づきました。<windowsx.h>つまり、メソッドSelectFontと衝突するマクロです。CMFCButton::SelectFont免責事項: 私は試していませんが、この場合、Microsoft は独自のコードとの名前の衝突を回避していないようです。

そして、悪名高いと のマクロの使用がminあります。とか、こんな使い方もありました。最近はチェックしていません。max<gdiplus.h>

だから、気をつけて!:-)

于 2013-02-13T05:00:01.683 に答える
-2

名前空間を使用してください。それが目的です!

namespace YourNamespace{
  class Polygon{ 
    //
  };
}

別の回避策は、これを行うことです。

#include <windows.h>
#define Polygon _Polygon

class _Polygon{ 
};
于 2013-02-13T04:57:11.630 に答える