gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:16:06 28 4
gpt4 key购买 nike

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

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com