自定义GetCursor函数与Windows系统头文件中同名函数冲突的解决咨询
嘿,我太懂你这种纠结了——自己写的函数用惯了,不想随便改名,但Windows系统头文件偏要撞名字,真的头疼。咱们先拆解下问题,再看看可行的解决办法:
首先,你之前尝试的宏定义方法为啥会失败?原因很简单:宏是纯文本替换,你定义的#define GetCursor() GetCursorX()会把Windows头文件里的GetCursor(VOID)直接替换成GetCursorX()(VOID),这就变成了给无参数的GetCursorX()硬塞一个参数,编译器当然会报错说宏参数不匹配。而且就算这个宏能正常工作,最后你还是会面临一个核心问题:C++不允许全局作用域里存在同名但返回值不同的函数(这不属于重载范畴),所以就算绕开了宏的问题,两个GetCursor的声明还是会冲突。
那有没有不用改名的办法?当然有,最推荐的是下面这个:
方案1:用命名空间包裹自己的函数
这是C++解决名字冲突的标准操作,完全不需要改函数名,只需要把你的函数放到自定义命名空间里:
在你的头文件Drawbox.h里修改:
namespace Drawbox { int GetCursor(); }
在实现文件Drawbox.Win.cpp里对应修改:
namespace Drawbox { int GetCursor() { // 你的原有实现代码 } }
之后在调用这个函数的时候,加上命名空间前缀就行:
int cursorVal = Drawbox::GetCursor();
这样你的GetCursor就和Windows全局的GetCursor完全隔离开了,再也不会有冲突。
方案2:重命名自己的函数
如果觉得命名空间太麻烦,那只能退而求其次,把你的GetCursor()改成比如GetCursorX()或者其他不冲突的名字。虽然要改所有调用的地方,但胜在直接简单,不会引入额外的语法复杂度。
至于你想“隐藏”Windows的GetCursor,其实不太现实——Windows系统函数是全局暴露的,而且C++的规则不允许全局同名不同返回值的函数共存,所以要么用命名空间隔离,要么改名,没有别的捷径啦。
备注:内容来源于stack exchange,提问作者Joymaker

