我正在编译我使用的项目之一,这次是使用 VS2010,只是为了发现 windows.h 中的一个包含有一个 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(而且我不拥有大部分代码),并试图将影响降到最低,我执行了以下操作:
//我的文件.cpp
#include <foo.h>
namespace windowsLib { //I added this
# include <windows.h>
}
using namespace windowsLib;
到目前为止,这种方法运行良好,但我想问您是否发现这种方法存在潜在问题,或者您是否有更好的建议。
编辑:
我感谢所有关于为什么这是一个坏主意的评论和解释。我从您的评论中得到的是我应该更改 foo.h 并将内容放入命名空间中。但是,这样做会影响数十个文件,甚至更多,现在需要命名空间限定。
有没有办法在不触及所有这些文件的情况下“以正确的方式”做到这一点?
如果我是代码的所有者,我会做这个更改并完成它,但我必须提出一个解决方案并获得批准并分配给某人,等等。所以如果更改是最小。
编辑 2:
我的最终建议是将类(class)分成两部分,如下所示:
// stub .cpp
#include <windows.h>
//Implementation of wrapper methods
// stub .h
class stub {
//public wrapper methods
}
//我的文件.cpp
#include <stub.h>
#include <foo.h>
我接受 Benlitz 的回答,因为该建议也可以解决我目前面临的当前最小影响限制的问题。不过,我感谢大家的评论。
最佳答案
不仅语言不允许(假设标准头文件将包含在命名空间内),调用在<windows.h>
中声明的任何 函数也存在问题。并发现链接器将在命名空间 windowsLib
中查找它们.
只是行不通!
关于c++ - 使用命名空间避免名称冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10607843/