问题标签 [calling-convention]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
10471 浏览

c - 函数指针和调用约定

如何使用调用约定声明函数指针?以上给了我一个错误。

0 投票
1 回答
1155 浏览

c++ - 检查指针函数类型的调用约定

如何在编译时检查函数指针是否具有__stdcall调用约定?

就像是

或者至少

0 投票
3 回答
2156 浏览

c# - c# 中的 __fastcall 约定

考虑到:

微软特定

__fastcall 调用约定指定函数的参数将在可能的情况下在寄存器中传递。以下列表显示了此调用约定的实现。

而且寄存器中的读/写时间比堆栈中的快得多,我们在 C# 中是否有任何 __fastcall 等效项?

0 投票
2 回答
4256 浏览

c - 函数返回结构的调用约定

对于以下 C 代码:

我得到以下 Win32 的反汇编:

对于 Linux32:

我试图了解呼叫者在通话后的行为方式的差异。为什么 Linux32 中的调用者会做这些额外的 subs?

我假设两个目标都遵循 cdecl 调用约定。cdecl 不是为返回结构的函数定义调用约定吗?!

编辑:

我添加了被调用者的实现。果然,你可以看到 Linux32 被调用者弹出它的参数,而 Win32 被调用者没有:

Win32反汇编:

Linux32反汇编:

0 投票
8 回答
14958 浏览

c++ - “cdecl”代表什么?

是的,我知道“cdecl”是一个显着的调用约定的名称,所以请不要向我解释调用约定。我要问的是缩写(?)“cdecl”实际上代表什么。我认为这是一个糟糕的命名选择,因为乍一看它让人想起“C​​ 声明符”(C 的一个相当独特的句法方面)。事实上,有一个名为cdecl的程序,其唯一目的是破译 C 声明符。但据我所知,C 声明符语法与调用约定完全无关。

简化版:“stdcall”代表“标准调用约定”。“cdecl”代表什么?

0 投票
5 回答
7911 浏览

c# - 按值调用和按值传递是同义词吗?

我一直认为按值调用和按值传递同义词。然而,我最近听到有人提到他们,好像他们是不同的。它们是一样的吗?

我也在谈论他们相应的参考术语。

0 投票
4 回答
1474 浏览

.net - 如果违反调用约定(在 .NET 3.5 中),为什么 PInvoke 不会崩溃?

我的解决方案有一个非托管 C++ DLL,它导出一个函数,以及一个 PInvoke 这个函数的托管应用程序。

我刚刚将解决方案从 .NET 3.5 转换为 .NET 4.0 并得到了这个 PInvokeStackImbalance “A call to PInvoke function [...] has unbalanced the stack”异常。事实证明,我正在调用 __cdecl'ed 函数,因为它是 __stdcall:

C++ 部分(被调用者):

C#部分(调用者):

所以,我已经修复了这个错误,但现在我对它在 .NET 3.5 中是如何工作的感兴趣?为什么(多次重复)没有人(被调用者或调用者)清理堆栈,没有导致堆栈溢出或其他一些不当行为,而是正常工作的情况?PInvoke 中是否有某种检查,就像 Raymond Chen 在他的文章中提到的那样?这也很有趣,为什么相反类型的破坏约定(让 __stdcall 被调用者像 __cdecl 一样被 PInvoked)根本不起作用,只导致 EntryPointNotFoundException。

0 投票
1 回答
11652 浏览

c# - 将 C# 委托的调用约定更改为 CDECL

我在使用 DotNet1.1 时遇到了 C# 的这个问题

问题是这样的。我有一个非托管 dll,它有一个带有函数指针(以及其他参数)的函数。当我在 C# 代码中声明 DLLImport 时,我传递了一个委托。但是 C# 中的委托具有stdcall调用约定,而非托管函数需要一个cdecl函数指针。因此,我天真的方法导致了崩溃。然后我发现了以下内容:http://www.codeproject.com/KB/cs/cdeclcallback.aspx有人编写了一个出色的库,据我所知,MSIL-hacking 可以更改委托的调用约定。事情进展顺利,直到...

我迁移到 VS2008 和新版本的 .NET。在此版本下,上述库不起作用。我并不是真正的 C# 或 .NET 专家,而且说实话,我几乎不了解他的库是做什么的(尽管它是开源的),所以我什至不想尝试将其适应新的 .NET。但是,我希望更新版本的 C# 可以为我的问题提供更好的解决方案。

所以,SO专家,请帮我解决我的臀部疼痛:)

0 投票
4 回答
7452 浏览

assembly - 可变参数函数如何找出机器代码中的参数数量?

像printf这样的可变参数函数如何找出它们得到的参数数量?

参数的数量显然不是作为(隐藏)参数传递的(请参阅此处 asm 示例中对 printf 的调用)。

有什么诀窍?

0 投票
4 回答
4194 浏览

c++ - C++:通过引用或值传递向量结构?

这是我的向量结构:struct Vector{ float x, y; };

  • 我应该按值还是按方式将它传递给函数const Vector&