c++ - 为什么线程函数需要声明为 '__cdecl' ?

标签 c++ multithreading mfc boost

显示如何使用 MFC 创建线程的示例代码将线程函数声明为静态函数和 __cdecl。为什么需要后者? Boost 线程不理会这个约定,所以它只是一个时代错误吗?

例如(MFC):

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

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

鉴于 boost :

static void func()
{
...
}

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

(代码示例可能不是 100% 正确,因为我离 IDE 还很远)。

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

最佳答案

__cdecl 告诉编译器使用 C 调用约定(与 stdcall、fastcall 或您的编译器支持的任何其他调用约定相反)。我相信,VC++ 默认使用 stdcall。

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

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

关于c++ - 为什么线程函数需要声明为 '__cdecl' ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/170380/

相关文章:

c++ - SetWindowDisplayAffinity 在 MFC 窗口中不起作用

c++ - 如何以编程方式关闭 Windows 中打开的文件/应用程序?

winapi - 如何防止 MFC 中基于 CScrollView/CFormView 的类中的滚动条 (Windows Mobile 6)

使用 gcc 的 c++ 命令行编译

c++ - 为什么拥有的窗口显示在拥有的窗口上方?

c++ - 如何在 Xcode 上设置文件以仅在设备上构建而不在模拟器上构建?

java - 我可以通过不可变对象(immutable对象)使此类线程安全吗?

java - 在另一个线程中使用在一个线程中生成的数据

c++ - 从 C++ 中的 3D 矩阵中提取 2D 矩阵

java - 在 Java 中进行多线程时,常规队列不适合使用吗?