gpt4 book ai didi

全局命名空间的 C++ 别名

转载 作者:行者123 更新时间:2023-11-30 00:45:48 24 4
gpt4 key购买 nike

我使用 Visual Studio 为 Windows 创建 C++ 程序。我想知道最好的方法是编写 Windows API 函数(包括宏),就好像它们是命名空间的一部分一样,例如WinAPI。我以前定义了一个空的宏,所以预处理器删除了它,只有::会留在代码中,这意味着全局作用域:

#define WinAPI
BOOL bResult = WinAPI::SetWindowText( hwnd, L"Test Text" );

// After preprocessing:
BOOL bResult = ::SetWindowText( hwnd, L"Test Text" );

但是,我遇到了宏的问题,比如 ListBox_AddString;此外,我认为我的解决方案并不完美。

我想一眼看出函数调用是 Windows API 的一部分,还是我的具有相似名称的函数之一。有没有以某种方式使用命名空间而不是空宏的解决方案?

更新

我尝试实现 Richard Hodges 的提议(使用 Visual Studio 2010):

namespace MyNamespace
{
int APIENTRY wWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR szCmdLine, int iShowCmd )
//...
}

首先我收到 LNK1561:必须定义入口点,所以我设置项目属性 > 链接器 > 链接器 > 高级 > 入口点 = MyNamespace::wWinMain

然后我收到 LNK1221:一个子系统不能被推断,必须定义,所以我设置项目属性 > 链接器 > 链接器 > 系统 > 子系统 = Windows (/SUBSYSTEM:WINDOWS)

现在它可以编译、链接和运行,但 iShowCmd 是 0x7efde000(我无法解释的值)而不是通常的 (SW_SHOW = 0x00000001)。

怎么了?

最佳答案

我认为您会发现将应用程序的所有类和函数放在一个应用命名空间中,并将全局命名空间视为属于“当前系统环境”会更有效率。

全局命名空间总是已经被 c 库、windows、posix、OSX 等污染了。

您无法避免这种情况,因为不存在仅具有 c++ API 的操作系统。

关于全局命名空间的 C++ 别名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41677241/

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