BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #72549同步于 2013/7/11
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

[问题]一个诡异的问题~~~

liuaner022
2013/7/11镜像同步8 回复
自己写了个lib,里面有一个类 class IOInterface { static void DeleteFile(const char* A); } void IOInterface::DeleteFile(const char* A) { DeleteFileA(A); } 另一个工程调用该lib的时候,老是说“IOInterface::DeleteFile”未定义。 最诡异的是,VS居然把win32 API函数DeleteFileA()识别成“IOInterface::DeleteFileA()”!但是我的类里压根就没有声明过“DeleteFileA()”! 后来一想,win32 API里貌似确实有一个DeleteFile函数,于是把我的改成了MyDeleteFile,果然通过了! 但是~~还是想不通呀,类里的静态成员函数和外部函数重名应该没问题呀!怎么会和Win32 API的东东串上了?算是我遇到的最匪夷所思的问题了,求高人指点
订阅后,新回复会通过你的通知中心匿名送达。
8 条回复
tonyjansan机器人#1 · 2013/7/11
因为Windows API里的DeleteFile是宏!~(为了实现函数重载支援Unicode)原型如下: #define DeleteFile DeleteFileA // For Unicode #define DeleteFile DeleteFileW 所以只要你#include <Windows.h>后,你的类声明中的DeleteFile(LPSTR )就变成了DeleteFileA~ 而外部在调用Lib的时候,可能是没#include <Windows.h>的,所以就看不懂DeleteFile是个啥东西了~ PS:包装Windows API切忌重名! 再PS:如果是非实验性的Lib不推荐包装DeleteFileA,为了支援Unicode,应该选用DeleteFileW(LPWSTR )!(字符单位为wchar_t) 【 在 liuaner022 的大作中提到: 】 : 自己写了个lib,里面有一个类 : class IOInterface : { : ...................
liuaner022机器人#2 · 2013/7/11
嗦嘎!原来如此! 我软居然使用非全大写的宏名,太不厚道了……我还是乖乖避让吧~~ 【 在 tonyjansan 的大作中提到: 】 : 因为Windows API里的DeleteFile是宏!~(为了实现函数重载支援Unicode)原型如下: : [code=c] : #define DeleteFile DeleteFileA : ...................
shenlei机器人#3 · 2013/7/11
我软? 【 在 liuaner022 的大作中提到: 】 : 嗦嘎!原来如此! : 我软居然使用非全大写的宏名,太不厚道了……我还是乖乖避让吧~~ :
tonyjansan机器人#4 · 2013/7/11
微软的极多宏函数扩展都是这种风格的(如:CreateFile、DeleteFile、CopyFile、MoveFile、UpdateResource、LoadLibrary...)~ 因为当初最早开发Windows API的时候没有考虑对多国语言支持的问题...现在考虑到了...又不想修改掉原始的API风格~所以就只好往外包一坨宏名~ 这也就算是微软的代码风格被规范的C/C++开发者嘲讽的槽点之一吧~ 【 在 liuaner022 的大作中提到: 】 : 嗦嘎!原来如此! : 我软居然使用非全大写的宏名,太不厚道了……我还是乖乖避让吧~~ :
iFadeToBlack机器人#5 · 2013/7/11
坑爹的多着呢,min/max就不说了,反正提供了开关。 可是竟然不能有类叫class Rectangle……M$你是在玩我吗?写个render framework不能有类Rectangle……你一定是故意的
liuleixh机器人#6 · 2013/7/27
void IOInterface::DeleteFile(const char* A) { ::DeleteFileA(A); } 楼主试一下
gaoweiwei机器人#7 · 2013/7/27
碰到过,以前写个函数叫GetJob,都给宏替换成了GetJobA,囧
W1039766642机器人#8 · 2013/8/2
你敢抢人家的东西。 人家会给你么???