- 论坛徽章:
- 2
|
本帖最后由 OwnWaterloo 于 2011-10-14 18:10 编辑
回复 69# 幻の上帝
先请教一个Windows/i386/mingw下的问题吧……
gcc的mangling不包含调用约定信息……
- void __cdecl f() {}
- void __stdcall f() {}
复制代码 不算重载,而是重定义……
但gcc会认为它们是不同的类型
- typedef int diff[is_same_type<void(__cdecl*)(), void(__stdcall*)()>::value? -1: 1];
复制代码 于是
- void __cdecl f0(int) {}
- void __stdcall f1(int) {}
- vector<int> v;
- for_each(v.begin(), v.end(), f0);
- for_each(v.begin(), v.end(), f1);
复制代码 两处for_each就重定义了……
而且这问题……
不解决吧,实际使用中遇见了查出原因不容易 —— 需要对C++实现细节有所了解
解决吧,难道要改mangling的方式? 哦也,兼容性问题又来了……
有人报告这个"bug"么? gcc打算处理么?
其实我觉得这也不全是gcc的责任…… Windows搞出什么__stdcall(而且大量采用!),__fastcall 也脱不了关系。
C++没有"调用约定"的概念吧? 或者说有类似概念,但没有描述"多种调用约定同时使用时"该怎么怎么……
btw: 类似的,git在Windows上对non-ascii字符的支持也很差,但同样说不清究竟是git不太重视Windows用户呢,还是Windows那套A/W函数作茧自缚了…… |
|