今回は VS2010 で作業しているプロジェクトの 1 つをコンパイルしていましたが、windows.h のインクルードの 1 つに、既にあるコードの export const 文字列と衝突する typedef INPUT があることがわかりました。
//winuser.h (行: 5332)
typedef struct tagINPUT {
DWORD type;
union
{
MOUSEINPUT mi;
KEYBDINPUT ki;
HARDWAREINPUT hi;
};
} INPUT, *PINPUT, FAR* LPINPUT;
//foo.h
//stuff here
extern FOO_DLL_API const string INPUT;
今、私は問題のある .cpp で INPUT を使用せず (そして私はほとんどのコードを所有していません)、影響を最小限に抑えようとして、次のことを行いました。
//myfile.cpp
#include <foo.h>
namespace windowsLib { //I added this
# include <windows.h>
}
using namespace windowsLib;
これまでのところ、このアプローチはうまく機能していますが、このアプローチに潜在的な問題があるかどうか、またはより良い提案があるかどうかを尋ねたいと思います.
編集:
これが悪い考えである理由についてのすべてのコメントと説明に感謝します。あなたのコメントから得たのは、foo.h を変更して内容を名前空間に入れる必要があるということです。ただし、それを行うと、名前空間の修飾が必要になる数十個のファイルに影響を与えることになります。
これらすべてのファイルに触れることなく、これを「正しい方法」で行う方法はありますか?
私がコードの所有者だったら、この変更を行って完了しますが、解決策を提案し、それを承認して誰かに割り当ててもらう必要があります。したがって、変更が最小限であれば簡単です。
編集2:
私の最終的な提案は、次のようにクラスを 2 つに分割することでした。
//stub.cpp
#include <windows.h>
//Implementation of wrapper methods
//stub.h
class stub {
//public wrapper methods
}
//myfile.cpp
#include <stub.h>
#include <foo.h>
その提案は、現在直面している現在の最小限の影響の制約の問題も解決するため、Benlitz の回答を受け入れています。しかしながら、皆様のコメントに感謝いたします。