1

ばかげたバグをキャッチしました。関数を含むzip処理ライブラリがありCreateFile()ます。Winbase.h、ヘッダーの奥深くに含まれており、それを as として再定義しCreateFileW、リンカーが狂います。

もちろんwinbase、この特定のケースでは除外します。そもそも範囲内にあるべきではありません。しかし、理論的な問題は依然として興味深いものであり、

一部の定義をローカルで抑制する方法はありますか?

4

5 に答える 5

2

問題のあるヘッダーファイルを削除することは、常にこれに対する最良の解決策です(特に、同じ大きさのヘッダーファイルは、多くのプロジェクトで私の好みにはあまりにも自由に含まれています)windows.hwinbase.h

他の唯一の解決策は#undef offending_symbol.

もちろん、もう 1 つの重要なことは、「Windows/Linux システム コール名と一致する名前を使用しない」ことですCreateFile

于 2013-04-26T09:08:05.907 に答える
2

プリプロセッサ マクロには、C++ スコープの概念がありません。#defines は単なるテキスト置換です。'local'#defineが必要な場合は、次のようにします。

#define CreateFileW CreateFile
... // here I can use the macro
#undef CreateFileW

またはあなたの場合

#undef CreateFileW
... // Here the macro is not available
#define CreateFileW CreateFile
于 2013-04-26T06:43:55.013 に答える
1

前述のことを除けば、#undef技術的には s に対してできることはあまりなく#define、少なくとも移植性はありません。

最善の方法は、まったく使用#defineしないか、少なくとも使用を最小限に抑え、可能な限り制限することです。定型コードを数回生成するためのマクロが必要な場合があります。#undef完了したら、必ずそのマクロを実行してください。#define私が考えることができる他の唯一の有効なアプリケーションは、条件付き前処理のためのガードとフラグを含めることです。

#defineWinAPI ヘッダーのような病気の場合は、可能な限り制限する必要があります。#defineヘッダーでその API の d 型を使用しないでください。アプリケーション全体で API を使用することはほとんどないため、API の周りの小さなレイヤーの cpps でのみ使用してください。このように依存関係を減らすことは、コードの残りの部分を駆除するだけではありません。

于 2013-04-26T06:59:12.330 に答える
1

がある

#undef

これは定義を削除します(ただし、他には何もありません)。

于 2013-04-26T06:43:20.513 に答える