14

WinDef.hの奥深くには、セグメント化されたメモリ時代のこの遺物があります。

#define far
#define near

これは、変数名の近くまたは遠くを使用しようとすると、明らかに問題を引き起こします。クリーンな回避策はありますか?それ以外の場合、変数の名前を変更しますか?

4

5 に答える 5

27

他の人からの主張に反して、それらを安全に未定義にすることができます。その理由は、それらが単なるマクロだからです。それらは、定義と未定義の間のプリプロセッサにのみ影響します。あなたの場合、それはwindows.hの早い段階からwindows.hの最後の行までになります。追加の Windows ヘッダーが必要な場合は、windows.h の後、#undef の前に含めます。コードでは、意図したとおり、プリプロセッサは単にシンボルを変更しないままにします。

古いコードに関するコメントは関係ありません。そのコードは別のライブラリにあり、個別にコンパイルされます。これらが接続されるのは、リンク時のみで、マクロがなくなって久しいからです。

于 2008-09-23T07:23:55.580 に答える
8

以下を含めた後、不要なマクロの定義を解除しますwindows.h

#include <windows.h>
#undef near
#undef far
于 2008-09-23T02:18:08.623 に答える
4

多分:

#undef near
#undef far

でも危険かもしれない...

于 2008-09-23T02:15:50.500 に答える
1

おそらくどこでも未定義の近くと遠くを望まないでしょう。ただし、変数名を使用する必要がある場合は、次を使用してマクロをローカルで定義解除し、完了したら元に戻すことができます。

#pragma push_macro("near")
#undef near
//your code here.
#pragma pop_macro ("near")
于 2008-09-23T03:02:48.873 に答える
-2

しないのが最善です。それらは、古いコードとの下位互換性のために定義されています-何らかの方法でそれらを取り除き、後でその古いコードの一部を使用する必要がある場合は、壊れてしまいます。

于 2008-09-23T02:16:36.473 に答える