std::函数如何知道调用约定
How does std::function know about calling convention?
int __cdecl ccall(int i)
{
wprintf(L"ccall(%d)", i);
return 0;
}
int __stdcall stdcall(int i)
{
wprintf(L"stdcall(%d)", i);
return 0;
}
int __cdecl wmain(int argc, wchar_t **argv)
{
std::function<int(int)> fnc = ccall;
std::function<int(int)> fnstd = stdcall;
fnc(10); // printed well
fnstd(100); // printed well
return 0;
}
我关心如何为对象分配__stdcall function
std::function
。但是没有任何指定的调用约定,它看起来工作正常。std::function
怎么知道什么是调用约定?
std::function
能够存储使用任何调用约定的函数指针。
§ 20.8.11.2:
函数类模板提供通用函数指针概念的多态包装器。包装器可以存储、复制和调用任意可调用对象 (20.8.1),给定调用签名 (20.8.1),允许函数成为一等对象。
正如 John Calsbeek 所补充的那样:标准中没有关于调用约定的特别内容,但编译器正在做他们的工作,函数指针包含有关约定的信息。
使用函数指针时,您需要指定不寻常的调用约定:
typedef int(* c_ptr_t)(int);
typedef int(__stdcall * std_ptr_t)(int);
c_ptr_t c_ptr = ccall;
std_ptr_t std_ptr = stdcall;
// But std::function doesn't mind:
std::function<int(int)> fnc = c_ptr;
std::function<int(int)> fnstd = std_ptr;
相关文章:
- 为什么在 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中调用约定