全局命名空间

时间:2017-01-16 13:13:38

标签: c++ namespaces

我使用Visual Studio在C ++ for Windows中创建程序。我想知道编写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:无法推断子系统,必须定义,所以我设置项目属性>链接器>链接器>系统> SubSystem = Windows(/ SUBSYSTEM:WINDOWS)

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

有什么问题?

1 个答案:

答案 0 :(得分:6)

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

全局命名空间始终已被c库,windows,posix,OSX等污染。

您无法避免这种情况,因为没有只有c ++ API的操作系统。

相关问题