c++ - 使用命名空间避免名称冲突

标签 c++ namespaces

我正在编译我使用的项目之一,这次是使用 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/

相关文章:

c++ - 哪个库包含 _is_c_termination_complete

C++ 内存分配

c++ - 调试 C++ 库

c# - 命名空间中类的声明

Javascript:在没有 eval 的情况下使用函数名称从 String 调用用匿名函数编写的函数?

c++ - 嵌套类继承错误

c++ - 家谱软件中的循环

c# - 防止内部类的 namespace 出现在智能感知中

python - 如何将 tensorflow.keras 模型移动到 GPU

soap - Hive UDF for SOAP XPath?