我们有一个庞大的 C++ 代码库,其中包含大量 COM 对象。暴露给 COM 的每个函数都必须有 __stdcall
调用约定(通常是 STDMETHODCALLTYPE
宏),因此我们有很多标记为 STDMETHODCALLTYPE
的函数。
现在我看到一个函数不是通过 COM 直接调用的,而是仅从我们的 C++ 代码中调用的,并且该函数的签名中也有 STDMETHODCALLTYPE
宏。我完全确定宏在那里毫无用处 - 从未发生过通过 COM 调用该函数的情况。
我是否应该删除 __stdcall
以便它成为“默认”调用约定函数?我如何做出这样的决定?
最佳答案
我的方法是对内部代码使用默认的编译器调用约定,并对跨模块边界导出的任何方法使用明确定义的调用约定。
出于性能原因,大多数编译器的默认调用约定充分利用了寄存器,因此在适当的地方使用它是有好处的。它还使您的代码看起来更容易,因为您无需指定约定即可获得默认值。
对于导出的函数,您显然需要指定约定。如果您正在制作一个您预计会从 C 或 C++ 以外的语言调用的库,那么通常使用 stdcall。如果您只期望 C 或 C++ 客户端,那么 cdecl 可能是最常见的约定。
关于c++ - 当我真的不关心调用约定时,我是否应该更喜欢 "default"调用约定而不是 __fastcall?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5870566/