我使用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:必须定义入口点,所以我设置Project Properties> Linker> Linker> Advanced> Entry Point = MyNamespace :: wWinMain
然后我收到了LNK1221:一个子系统无法推断,必须定义,所以我设置项目属性>链接器>链接器>系统>子系统= Windows(/ SUBSYSTEM:WINDOWS)
现在它编译,链接和运行,但iShowCmd是0x7efde000(我无法解释的值)而不是通常的(SW_SHOW = 0x00000001).
怎么了?
我认为您会发现将所有应用程序的类和函数放在app命名空间中更有效率,并将全局命名空间视为属于"当前系统环境".
全局命名空间始终已被c库,windows,posix,OSX等污染.
你无法避免这种情况,因为没有只有c ++ API的操作系统.