c – 为什么需要将线程函数声明为’__cdecl’?

前端之家收集整理的这篇文章主要介绍了c – 为什么需要将线程函数声明为’__cdecl’?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
显示如何使用MFC创建线程的示例代码将线程函数声明为static和__cdecl.为什么需要后者?提升线程不打扰这个惯例,所以它只是一个时代错误吗?

例如(MFC):

static __cdecl UINT MyFunc(LPVOID pParam)
{
...
}

CWinThread* pThread = AfxBeginThread(MyFunc,...);

而提升:

static void func()
{
...
}

boost::thread t;
t.create(&func);

(代码示例可能不是100%正确,因为我不在IDE附近).

__cdecl有什么意义?它在创建线程时有何帮助?

解决方法

__cdecl告诉编译器使用C调用约定(而不是stdcall,fastcall或编译器支持的任何其他调用约定).我相信,VC默认使用stdcall.

调用约定会影响诸如如何将参数压入堆栈(或者在fastcall的情况下为寄存器)以及谁从堆栈(调用者或被调用者)中弹出参数.

在Boost的情况下.我相信它使用模板特化来确定适当的函数类型和调用约定.

猜你在找的C&C++相关文章