13得票2回答
为什么我不应该使用__fastcall而应该使用标准的__cdecl?

我听到一些人说__fastcall比__cdecl和__stdcall更快,因为它将两个参数放在寄存器中,而其他调用只有一个;但是,在另一方面,这不是C语言中使用的标准。 我想知道什么使__fastcall成为C语言标准中不理想的选项,以及何时在我的代码中使用它。

48得票10回答
你如何阅读C语言声明?

我听说过一些方法,但都不是很实用。个人尽量避免在C语言中使用复杂数据类型,而是将其分解成组件typedef。 现在我需要维护一些所谓的“三星程序员”编写的遗留代码,我很难阅读其中一些 ***code[][]. 你如何阅读复杂的C语言声明?

7得票2回答
C 调用约定:在可变参数函数和普通函数中,谁清理堆栈?

有一些调用约定(例如 pascal,stdcall),但据我所知,C 使用的是 cdecl (C-声明)。这些约定中,每个约定在调用者如何将参数加载到堆栈上以及哪一个(调用方 / 被调用方)清理堆栈的方式略有不同。 谈到清理堆栈,这就是我的问题。我不明白:这三件事情是否不同? 堆栈清理 ...

7得票1回答
当使用PInvoke调用C++ DLL时出现AccessViolationException异常(cdecl调用约定问题?)

我已经花了一整天的时间研究这个问题,但仍然无法理解: 我有一个C# DLL,其中PInvokes调用了一个C++ DLL中的方法。在Debug模式下编译时,我没有遇到任何问题,但在Release模式下编译时,我会遇到AccessViolationException异常。通过谷歌搜索,我发现可...

7得票1回答
为什么Go语言编译器“gc”使用不同于C语言的调用约定?

C语言使用的是cdecl调用约定,我已经研究并从汇编中进行了调用。它感觉很好,为什么要打破兼容性?为什么需要另一种约定?

7得票5回答
在C++中,可变参数函数(即参数列表末尾带有...的函数)是否必须遵循__cdecl调用约定?

我知道__stdcall函数不能有省略号,但我想确认是否有平台支持使用非__cdecl或__stdcall调用约定来支持stdarg.h函数。

10得票4回答
改变调用约定

我有一个第三方C API,需要一个__stdcall回调函数。 我的代码提供了一个外部提供的__cdecl回调函数。 由于它们被认为是不同类型,因此我无法将我的函数指针传递给C-API。 绕过类型系统并使用reinterpret_cast<>自然会导致运行时错误。 下面是来自这...

8得票1回答
C#获取未管理的C dll导出列表

我有一个带有导出函数的C语言dll。 我可以使用命令行工具dumpbin.exe /EXPORTS来提取导出函数列表,然后在我的C#代码中使用它们来(成功)调用这些函数。 是否有一种方法可以直接从.NET获取这个导出函数列表,而不必使用外部的命令行工具? 谢谢。

7得票3回答
结构体在汇编中如何作为参数传递

结构体在汇编中如何作为参数传递? 由于结构体的大小通常比较大,个别字段是否按顺序依次传递? 如果是,它们是否像普通参数一样按相反的顺序传递? cdecl和stdcall之间是否有任何差异?

11得票11回答
有没有一种方法可以在不使用 .* 或 ->* 运算符的情况下调用成员函数?

以下通过指向成员函数的指针调用 D::foo 函数的方法将会生成错误:必须使用 .* 或 ->* 在 'f (...)' 中调用指向成员函数的指针。当然,这不是我们调用指向成员函数的方式。 正确的调用方式是 (d.*f)(5); 或者 (p->*f)(5); 我的问题是,“有没...