我正在编译我工作的一个项目,这次使用的是VS2010,结果发现windows.h中的一个包含typedef INPUT的内容与我已有的代码中导出的常量字符串产生了冲突。//winuser.h(第5332行)
现在,在有问题的 .cpp 文件中,我不使用 INPUT(而且我不拥有大部分代码),并试图最小化影响,我进行了以下操作:
//myfile.cpp
到目前为止,这种方法运作良好,但我想问一下您是否认为这种方法存在潜在问题,或者您有更好的建议。
编辑:
感谢所有评论和解释,让我知道这是一个坏主意的原因。从您的评论中得出的结论是,我应该更改foo.h并将其内容放入命名空间中。然而,这样做会影响到数十个文件,甚至更多的文件,现在需要使用命名空间限定符。
有没有一种方法可以在不触及所有那些文件的情况下“正确地”做到这一点?
如果我是代码的所有者,我会进行此更改并完成它,但我必须提出一个解决方案并获得批准并指派给某人等等。因此,如果更改最小,则更容易。
编辑2:
我的最终提案是将类拆分为两部分,如下所示:
//stub.cpp
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:
我的最终提案是将类拆分为两部分,如下所示:
//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的答案,因为那个建议也可以解决我当前面临的最小影响限制问题。不过,我还是感谢大家的意见。
INPUT
现在是不明确的(只要在使用时进行消歧义,可以作为::INPUT
或windowsLib::INPUT
),而不是具有两个不同定义的符号(非法)。 话虽如此,这样做不好。 我建议采用 @Benlitz 的方法。 - cvoinescu