c++ - 引用如何出现在可从 C 代码调用的函数的签名中?

标签 c++ c pass-by-reference abi cdecl

我有点困惑:我有一个 C++ API,它应该从 C 代码调用并在函数声明中使用 __cdecl

有一个带有函数指针的虚表是这样的:

void (__cdecl *funptr) (const MyStruct& obj);

引用是一种 C++ 结构,不是吗?怎么会有带引用的__cdecl

最后:__cdecl 是否等同于将所有内容包装在 extern "C" 语句中?在那种情况下引用文献呢?

我有点糊涂了..

最佳答案

这些是苹果和橘子。

__cdecl 是一个非标准关键字,用于描述一种更常见的 x86 ABI 调用约定(连同 __stdcall),它指定了变量之间的传递/堆叠方式调用者和被调用者。它与 C 无关——一些历史悠久的 Microsoft C 编译器只是使用了这个调用约定,因此得名。许多编程语言都可以使用此调用约定,同样,C 代码也不必使用它。

extern "C" 只是意味着代码应该被 C++ 编译器编译为“像 C”,禁用 C++ 编译器内部使用的各种名称修改等。它不一定与兼容的 C 相关,但也可以在可能使用不同名称修饰的两个不同 C++ 编译器之间共享代码时使用。

两者都与引用的工作方式无关。在 C 中它们不会编译,在 C++ 中它们会编译。您发布的代码是 C++。

关于c++ - 引用如何出现在可从 C 代码调用的函数的签名中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72098438/

相关文章:

linux - 当lib函数与其系统调用同名时如何使用?

android - 将对象从 Activity 传递到 Fragments 是通过引用传递

javascript - 执行 foreach 时更改数组中的值

c++ - 什么是 undefined reference /未解析的外部符号错误以及如何修复它?

C 为什么传递这个易失变量的地址失败

c++ - 在没有实例的情况下获取 std::array 的大小

c - "GNU libs vs Gnulib vs Gnome glib"困惑

c++ - ( variable = &anotherVar ) 的大小是多少

c++ - <algorithm> 中的 Visual Studio 2008 错误? includes 算法似乎无意中交换了第 3795 行迭代器的顺序

c++ - ptrace - 仅 32 位的输入/输出错误(errno 5)