问题标签 [cdecl]

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 投票
10 回答
7744 浏览

c - 你如何阅读 C 声明?

我听说过一些方法,但没有一个能成功。就我个人而言,我尽量避免使用 C 中的复杂类型,并尝试将它们分解为组件 typedef。

我现在面临维护一些来自所谓的“三星级程序员”的遗留代码,而且我很难阅读一些 ***code[][]。

您如何阅读复杂的 C 声明?

0 投票
5 回答
2486 浏览

c++ - 在 C++ 中,可变参数函数(在参数列表末尾带有 ... 的函数)是否必须遵循 __cdecl 调用约定?

我知道 __stdcall 函数不能有省略号,但我想确保除了 __cdecl 或 __stdcall 之外,没有平台支持 stdarg.h 函数来调用约定。

0 投票
3 回答
2199 浏览

visual-studio-2010 - 如何使用 __cdecl 调用约定编译 boost?

我有一个使用__cdecl调用约定(msvc2010)编译的项目,我使用默认设置使用相同的编译器编译了 boost。

该项目与 boost 相关联,但我在运行时收到如下断言消息: File: ...\boost\boost\program_options\detail\parsers.hpp Line: 79

运行时检查失败 #0 - ESP 的值未在函数调用中正确保存。这通常是调用使用一种调用约定声明的函数和使用另一种调用约定声明的函数指针的结果。

有以下问题:

  • 在 Windows 上默认使用什么调用约定来提升构建(msvc2010)
  • 如何使用 __cdecl 调用约定编译 boost
  • 为什么 boost 无法阻止与具有不同调用约定的代码链接?我知道 boost 具有非常智能的库自动包含代码。

更新#1

看起来 boost 确实使用正确的调用约定进行编译和链接,但在运行时我仍然遇到上述问题。我使用相同的代码做了一个示例应用程序,它可以工作,但在我的应用程序中它失败了。唯一的区别可能来自项目配置或包含/stdafx.h

0 投票
2 回答
1180 浏览

c++ - 混合调用约定会导致编译错误

我有一个库(C++),它有一些 API 函数。其中之一被声明为 __cdecl,但从 __stdcall 获得一个函数指针。就像是:

然后 - 我有一个使用此库的 C++ 可执行项目,但不调用上述 API 或使用该Func类型。

Func更改to的调用约定后__stdcall,出现以下编译错误:

错误 C2995: 'std::pointer_to_unary_function<_Arg,_Result,_Result(__cdecl *)(_Arg)> std::ptr_fun(_Result (__cdecl *)(_Arg))' : 函数模板已定义 c:\program files\微软视觉工作室 8\vc\include\functional

知道会是什么吗?

提前致谢!!

0 投票
9 回答
115889 浏览

c++ - 标准调用和 cdecl

有(除其他外)两种类型的调用约定 - stdcallcdecl。我对他们有几个问题:

  1. 当调用 cdecl 函数时,调用者如何知道它是否应该释放堆栈?在调用点,调用者是否知道被调用的函数是 cdecl 还是 stdcall 函数?它是如何工作的 ?调用者如何知道它是否应该释放堆栈?还是链接者的责任?
  2. 如果一个声明为 stdcall 的函数调用一个函数(其调用约定为 cdecl),或者反过来,这是否不合适?
  3. 一般来说,我们可以说哪个调用会更快 - cdecl 或 stdcall ?
0 投票
1 回答
9043 浏览

c - 将参数从 C 传递到程序集?

如何将参数从 C 主函数传递给汇编函数?我知道我的自定义函数必须看起来像:

现在我将如何somedata在程序集文件中使用。我的操作系统是 Linux Ubuntu,我的处理器是 x86。

0 投票
4 回答
512 浏览

c - 下面的代码有什么作用?

可能重复:
您如何阅读 C 声明?

我不明白以下内容:

你能帮我吗?

0 投票
8 回答
14958 浏览

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

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

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

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 回答
793 浏览

stack - stdcall 和 cdecl 堆栈对齐大小

我有两个问题:

  1. stdcall 调用约定的堆栈对齐是否始终为 4 个字节,或者对于 32 位机器是 4,对于 64 位机器是 8?
  2. cdecl 的堆栈对齐大小是多少?

我正在使用 Microsoft Visual Studio 2010。