ばかげたバグをキャッチしました。関数を含むzip処理ライブラリがありCreateFile()
ます。Winbase.h
、ヘッダーの奥深くに含まれており、それを as として再定義しCreateFileW
、リンカーが狂います。
もちろんwinbase
、この特定のケースでは除外します。そもそも範囲内にあるべきではありません。しかし、理論的な問題は依然として興味深いものであり、
一部の定義をローカルで抑制する方法はありますか?
ばかげたバグをキャッチしました。関数を含むzip処理ライブラリがありCreateFile()
ます。Winbase.h
、ヘッダーの奥深くに含まれており、それを as として再定義しCreateFileW
、リンカーが狂います。
もちろんwinbase
、この特定のケースでは除外します。そもそも範囲内にあるべきではありません。しかし、理論的な問題は依然として興味深いものであり、
一部の定義をローカルで抑制する方法はありますか?
問題のあるヘッダーファイルを削除することは、常にこれに対する最良の解決策です(特に、同じ大きさのヘッダーファイルは、多くのプロジェクトで私の好みにはあまりにも自由に含まれています)windows.h
。winbase.h
他の唯一の解決策は#undef offending_symbol
.
もちろん、もう 1 つの重要なことは、「Windows/Linux システム コール名と一致する名前を使用しない」ことですCreateFile
。
プリプロセッサ マクロには、C++ スコープの概念がありません。#define
s は単なるテキスト置換です。'local'#define
が必要な場合は、次のようにします。
#define CreateFileW CreateFile
... // here I can use the macro
#undef CreateFileW
またはあなたの場合
#undef CreateFileW
... // Here the macro is not available
#define CreateFileW CreateFile
前述のことを除けば、#undef
技術的には s に対してできることはあまりなく#define
、少なくとも移植性はありません。
最善の方法は、まったく使用#define
しないか、少なくとも使用を最小限に抑え、可能な限り制限することです。定型コードを数回生成するためのマクロが必要な場合があります。#undef
完了したら、必ずそのマクロを実行してください。#define
私が考えることができる他の唯一の有効なアプリケーションは、条件付き前処理のためのガードとフラグを含めることです。
#define
WinAPI ヘッダーのような病気の場合は、可能な限り制限する必要があります。#define
ヘッダーでその API の d 型を使用しないでください。アプリケーション全体で API を使用することはほとんどないため、API の周りの小さなレイヤーの cpps でのみ使用してください。このように依存関係を減らすことは、コードの残りの部分を駆除するだけではありません。
がある
#undef
これは定義を削除します(ただし、他には何もありません)。