有(除其他外)两种调用约定 – stdcall和cdecl 。 我对他们有几个问题: 当一个cdecl函数被调用时,一个调用者怎么知道它是否应该释放栈? 在呼叫站点,呼叫者是否知道被调用的函数是一个cdecl函数还是一个stdcall函数? 它是如何工作的 ? 来电者如何知道是否应该释放堆栈? 还是连接器的责任? 如果一个被声明为stdcall的函数调用一个函数(调用约定为cdecl),或者相反,这会不合适吗? 一般来说,我们可以说哪个调用会更快 – cdecl或stdcall?
我听说过一些方法,但没有一个卡住了。 我个人尽量避免在C中的复杂types,并尝试将它们分解成组件types定义。 我现在正在维护一个所谓的“三星级程序员”的遗留代码,而且我正在阅读一些***代码[] []。 你如何阅读复杂的C声明?
我正在研究一个相当大的代码库,其中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)] // […]