问题标签 [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.
c++ - 如何声明 __stdcall 函数指针
我试过这个
这编译但给了我这个警告(VS2003):
警告 C4229:使用不合时宜:忽略数据上的修饰符
我想用 stdcall 调用约定声明一个指向函数的指针?我究竟做错了什么?
android - 通话结束后从通话记录中删除通话
我是 Android 开发的新手。我想拨打一个号码,但我不想将号码存储在我的通话记录中。通话结束后如何从通话记录中删除号码?
c - C:通过堆栈/寄存器问题返回值
我是 C 新手,有一件事我无法理解。当函数返回不大于寄存器的东西时——我的编译器将它放在 EAX 中。当我返回大结构(不是指针而是结构本身)时——它是通过堆栈返回的。
我的问题是:编译器如何知道如何调用另一个对象导出的函数?有一个调用约定(如 stdcall),但它是关于传递参数,而不是读取返回值,对吗?
应该有一些规则,例如“如果声明的返回值大于 EAX,则从 [bp-...] 获取它”。
还有一个:是否应该说我想要返回的大于寄存器的对象应该存储在堆中并通过指针返回以防止所有操作而不是堆栈操作?
谢谢。
c++ - C++ 函数参数的连续内存保证
Appel [App02]非常简要地提到,当地址操作符应用于功能块内的形式参数之一时,C(并且可能是 C++)提供了关于实际参数在连续内存中的位置的保证,而不是寄存器。
例如
和一个调用,如......
将产生以下输出“1 2 3 4”
我的问题是“这如何与调用约定交互?”
例如,GCC 上的 __fastcall 将尝试将前两个参数放在寄存器中,将其余参数放在堆栈中。这两个要求相互矛盾,有什么方法可以正式推断会发生什么,或者它是否受制于实现定义行为的反复无常的性质?
[App02] Java 中的现代编译器实现,Andrew w. 上诉,第 6 章,第 124 页
更新:我想这个问题已经回答了。我认为我将整个问题建立在连续内存分配上是错误的,因为我正在寻找(以及参考所说的)是由于使用 address-of 而在内存中的参数需求之间的明显不匹配,而不是由于调用约定而在寄存器中,也许这是另一天的问题。
互联网上的某个人是错误的,有时有人是我。
c - 程序激活时间
过程激活时间是否是编译时间的一部分,从而执行函数调用的准备工作?
或者它是实际调用函数时运行时的一部分?
(虽然不确定,但我正在考虑第二种选择)
c++ - 当我真的不关心调用约定时,我应该更喜欢“默认”调用约定而不是 __fastcall 吗?
我们有一个包含大量 COM 对象的庞大 C++ 代码库。每个暴露给 COM 的函数都必须有__stdcall
调用约定(通常是STDMETHODCALLTYPE
宏),所以我们有很多函数标记为STDMETHODCALLTYPE
。
现在我看到了一个不是通过 COM 直接调用的函数,而是仅从我们的 C++ 代码中调用的函数,并且该函数STDMETHODCALLTYPE
的签名中也有宏。我完全确定宏在那里毫无用处 - 没有通过 COM 调用该函数。
我应该放弃__stdcall
它以使其成为“默认”调用约定函数吗?我该如何做出这样的决定?
c++ - 调用约定是由编译器还是链接器处理的?
当我们把_stdcall
(调用者不需要清栈)放入函数原型时,是编译器还是链接器处理的?
c - Win VS2008调用约定:来自c的Delphi dll
从ac app(VS2008,Win),我在Borland用Delphi编写的dll中调用一个函数。该函数有效,但在每次调用后我都会收到此错误:“ESP 的值没有在函数调用中正确保存[…]”,这意味着我的调用约定是错误的。我不了解 Delphi,也没有完整的 dll 代码,但我相信这是 Delphi 功能:
c中的相关部分:
我尝试了 __cdecl 和 __fastcall,而不是上面 c 中的 __stdcall,但我总是收到 ESP 消息。此外,在 Dephi 函数代码中,该函数似乎返回 char*,但 dll 文档说它返回“true”或“false”(?)。因此,在 c 而不是“typedef char * ...”中,我尝试了“typedef BOOL ...”:仍然,我收到了 ESP 消息。我知道我可以在“基本运行时检查”(参见此处)下隐藏消息,但我宁愿正确调用语法。dll 是用 UPX 压缩的,但我不确定它是否相关(就像我说的,函数本身可以工作)。
c - 可以在c中使用不同的调用约定定义函数吗?
名称修改后将是:
哪个不冲突,这在 c 中是否允许,如果不允许,为什么?
c - C(不是 C++)按价值传递/参考面试问题
我有一个问题列表,我想问这些问题来探讨候选人的嵌入式系统编程 C 技能。我的标准问题之一,也在很多公共问题列表中,但我开始认为这是一个糟糕的问题:
“解释或对比 C 中的按值传递和按引用传递”
我告诉受访者,这个问题与 C++ 引用无关,我正在寻找关于将指针传递给变量与变量以及被调用者如何修改指针引用的变量的解释。关于如何将指针传递给结构更有效的解释的额外要点。
问题来了:C 中真的有“通过引用传递”吗?
被调用者的签名清楚地定义了传递的内容。这不像您可以将 x 或 &x 传递给函数并让编译器弄清楚要做什么。所以我认为一切都是 C 是按值传递的,而按引用传递实际上只是传递指针的值。
有什么根本不同的东西吗
对比
谢谢,安德鲁