返回信息流自己写了个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的东东串上了?算是我遇到的最匪夷所思的问题了,求高人指点
这是一条镜像帖。来源:北邮人论坛 / cpp / #72549同步于 2013/7/11
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
[问题]一个诡异的问题~~~
liuaner022
2013/7/11镜像同步8 回复
订阅后,新回复会通过你的通知中心匿名送达。
8 条回复
因为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
: {
: ...................
嗦嘎!原来如此!
我软居然使用非全大写的宏名,太不厚道了……我还是乖乖避让吧~~
【 在 tonyjansan 的大作中提到: 】
: 因为Windows API里的DeleteFile是宏!~(为了实现函数重载支援Unicode)原型如下:
: [code=c]
: #define DeleteFile DeleteFileA
: ...................
微软的极多宏函数扩展都是这种风格的(如:CreateFile、DeleteFile、CopyFile、MoveFile、UpdateResource、LoadLibrary...)~
因为当初最早开发Windows API的时候没有考虑对多国语言支持的问题...现在考虑到了...又不想修改掉原始的API风格~所以就只好往外包一坨宏名~
这也就算是微软的代码风格被规范的C/C++开发者嘲讽的槽点之一吧~
【 在 liuaner022 的大作中提到: 】
: 嗦嘎!原来如此!
: 我软居然使用非全大写的宏名,太不厚道了……我还是乖乖避让吧~~
:
坑爹的多着呢,min/max就不说了,反正提供了开关。
可是竟然不能有类叫class Rectangle……M$你是在玩我吗?写个render framework不能有类Rectangle……你一定是故意的