有(除其他外)两种调用约定 – stdcall和cdecl 。 我对他们有几个问题: 当一个cdecl函数被调用时,一个调用者怎么知道它是否应该释放栈? 在呼叫站点,呼叫者是否知道被调用的函数是一个cdecl函数还是一个stdcall函数? 它是如何工作的 ? 来电者如何知道是否应该释放堆栈? 还是连接器的责任? 如果一个被声明为stdcall的函数调用一个函数(调用约定为cdecl),或者相反,这会不合适吗? 一般来说,我们可以说哪个调用会更快 – cdecl或stdcall?
我正在学习Win32编程, WinMain原型如下所示: int WINAPI WinMain ( HINSTANCE instance, HINSTANCE prev_instance, PSTR cmd_line, int cmd_show ) 我很困惑这个WINAPI标识符是什么,并发现: #define WINAPI __stdcall 这是做什么的? 我很困惑,因为在返回types之后有什么东西。 什么是__stdcall ? 返回types和函数名称之间有什么意义时,这意味着什么?
我正在研究一个相当大的代码库,其中C ++功能是从C#调用的。 我们的代码库中有很多调用,例如… C ++: extern "C" int __stdcall InvokedFunction(int); 与相应的C#: [DllImport("CPlusPlus.dll", ExactSpelling = true, SetLastError = true, CallingConvention = CallingConvention.Cdecl)] private static extern int InvokedFunction(IntPtr intArg); 我已经搜寻了网络(就我的能力而言),为什么存在这种明显的不匹配。 例如,为什么C#中有一个Cdecl,C ++中有__stdcall? 显然,这会导致堆栈被清除两次,但是,在这两种情况下,变量都以相同的相反顺序被压入堆栈,这样我就不会看到任何错误,尽管返回信息在在调试过程中尝试跟踪? 从MSDN: http : //msdn.microsoft.com/en-us/library/2x8kf7zx%28v=vs.100%29.aspx // explicit DLLImport needed here to use P/Invoke marshalling [DllImport("msvcrt.dll", EntryPoint = "printf", CallingConvention = CallingConvention::Cdecl, CharSet = CharSet::Ansi)] // […]