将函数分配给具有相同签名但不同调用约定的 std::function 失败
assigning functions to std::function with same signature, but different calling convention fails
下面的编译和使用 mingw 4.7.2 和 -m64 标志运行良好。
但是对于 -m32 或任何 mingw 32 位版本,它无法编译。 这是一个错误还是我缺少编译器标志?
#include <iostream>
#include <functional>
using namespace std;
int __cdecl ccall(int i)
{
cout << i << endl;
return 0;
}
int __stdcall stdcall(int i)
{
cout << i << endl;
return 0;
}
int __fastcall fastcall(int i)
{
cout << i << endl;
return 0;
}
int main() {
std::function<int(int)> fnc = ccall;
fnc(10);
std::function<int(int)> fnstd = stdcall;
fnstd(100);
std::function<int(int)> fnfast = fastcall;
fnfast(200);
return 0;
}
错误信息:
...LocalTempcc4ekW9J.s: Assembler messages:
...LocalTempcc4ekW9J.s:30: Error: symbol `__ZNSt17_Function_handlerIFiiEPFiiEE9_M_invokeERKSt9_Any_datai' is already defined
...LocalTempcc4ekW9J.s:80: Error: symbol `__ZNSt14_Function_base13_Base_managerIPFiiEE10_M_managerERSt9_Any_dataRKS4_St18_Manager_operation' is already defined
...LocalTempcc4ekW9J.s:114: Error: symbol `__ZNSt14_Function_base13_Base_managerIPFiiEE10_M_managerERSt9_Any_dataRKS4_St18_Manager_operation' is already defined
在将调用"隐藏"在 lambda 函数中后,我最终以这种方式这样做,它工作得很好:
template<class Ret, class... Args> class StdCall
{
public:
typedef Ret(__stdcall Fn_t)(Args...);
typedef std::function<Ret (Args...)> Functor_t;
Functor_t get(Fn_t pFn)
{
return [pFn](Args... as){
return pFn(as...);
};
}
};
auto fn1 = CdeclCall<int,int>().get( ccall );
auto fn2 = StdCall<int,int>().get( stdcall );
fn1(123);
fn2(156);
算自己很幸运。想想使用错误的调用约定的函数调用可能导致的破坏!哦,只需创建一个具有"正确"调用约定的填充程序函数,该约定调用"错误"的调用约定。也许您可以将其隐藏在单独编译的文件中。
相关文章:
- 为什么在 x64 中忽略__stdcall调用约定?
- 窗口调用约定
- 我应该提到纯虚函数中的调用约定吗?
- 如何使用gcc指定stdcall调用约定
- Clang:x86 FPU调用约定
- 该标准是否说明了例外和不同调用约定的共存
- Clang++的InterlockedExchange的32位调用约定错误,但MSVC可以
- std::sort & comp - 调用约定?
- 如何为类 /块 /范围选择C 调用约定
- DLL 的"good"调用约定是什么?
- 结构中重载运算符的调用约定
- 'ShowSUM':__declspec(dllexport)不能应用于具有__clrcall调用约定的函数
- x86-64 调用约定中的返回值
- 内联功能和调用约定
- 正在直接显示筛选器中调用约定
- 何时使用`__fastcall`调用约定
- 为C++结构定义显式析构函数如何影响调用约定
- 由于使用 MFC 时"__cdecl"和"__thiscall"调用约定不匹配而导致的链接器错误?
- Microsoft Visual C++是否未使用带有浮点的C/C++调用约定
- 在Visual Studio中调用约定