103得票9回答
stdcall和cdecl

除其他外,调用规范中有两种类型-stdcall和cdecl。我对它们有一些问题: 当调用一个cdecl函数时,调用者如何知道是否应该释放堆栈?在调用点,调用者是否知道被调用的函数是cdecl还是stdcall函数?它是如何工作的?调用者如何知道是否应该释放堆栈?还是链接器有责任? 如果一个...

71得票2回答
为什么"Cdecl"调用在“标准”P/Invoke约定中经常不匹配?

我正在处理一个相当庞大的代码库,其中C++功能从C#中进行P/Invoke调用。 在我们的代码库中有许多这样的调用... C++: extern "C" int __stdcall InvokedFunction(int); 使用对应的 C# 代码: [DllImport("CPl...

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

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

41得票8回答
“cdecl”代表什么意思?

是的,我知道"Cdecl"是一个著名的调用约定名称,所以请不要向我解释调用约定。我想问的是缩写"Cdecl"实际上代表什么。我认为这是一个糟糕的命名选择,因为乍一看它让人想起"C declarator"(C语言中相当独特的语法方面)。实际上,有一个名为cdecl的程序,其唯一目的是解密C de...

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

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

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

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

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

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

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

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

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

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

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

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