除其他外,调用规范中有两种类型-stdcall和cdecl。我对它们有一些问题: 当调用一个cdecl函数时,调用者如何知道是否应该释放堆栈?在调用点,调用者是否知道被调用的函数是cdecl还是stdcall函数?它是如何工作的?调用者如何知道是否应该释放堆栈?还是链接器有责任? 如果一个...
我听说过一些方法,但都不是很实用。个人尽量避免在C语言中使用复杂数据类型,而是将其分解成组件typedef。 现在我需要维护一些所谓的“三星程序员”编写的遗留代码,我很难阅读其中一些 ***code[][]. 你如何阅读复杂的C语言声明?
是的,我知道"Cdecl"是一个著名的调用约定名称,所以请不要向我解释调用约定。我想问的是缩写"Cdecl"实际上代表什么。我认为这是一个糟糕的命名选择,因为乍一看它让人想起"C declarator"(C语言中相当独特的语法方面)。实际上,有一个名为cdecl的程序,其唯一目的是解密C de...
我听到一些人说__fastcall比__cdecl和__stdcall更快,因为它将两个参数放在寄存器中,而其他调用只有一个;但是,在另一方面,这不是C语言中使用的标准。 我想知道什么使__fastcall成为C语言标准中不理想的选项,以及何时在我的代码中使用它。
以下通过指向成员函数的指针调用 D::foo 函数的方法将会生成错误:必须使用 .* 或 ->* 在 'f (...)' 中调用指向成员函数的指针。当然,这不是我们调用指向成员函数的方式。 正确的调用方式是 (d.*f)(5); 或者 (p->*f)(5); 我的问题是,“有没...
我有一个第三方C API,需要一个__stdcall回调函数。 我的代码提供了一个外部提供的__cdecl回调函数。 由于它们被认为是不同类型,因此我无法将我的函数指针传递给C-API。 绕过类型系统并使用reinterpret_cast<>自然会导致运行时错误。 下面是来自这...
我已经花了一整天的时间研究这个问题,但仍然无法理解: 我有一个C# DLL,其中PInvokes调用了一个C++ DLL中的方法。在Debug模式下编译时,我没有遇到任何问题,但在Release模式下编译时,我会遇到AccessViolationException异常。通过谷歌搜索,我发现可...
结构体在汇编中如何作为参数传递? 由于结构体的大小通常比较大,个别字段是否按顺序依次传递? 如果是,它们是否像普通参数一样按相反的顺序传递? cdecl和stdcall之间是否有任何差异?