gpt4 book ai didi

c++ - 如何使用 MSVC 在 C++ 中定义外部 C 结构返回函数?

转载 作者:搜寻专家 更新时间:2023-10-31 00:48:22 25 4
gpt4 key购买 nike

以下源文件将无法使用 MSVC 编译器 (v15.00.30729.01) 进行编译:

/* stest.c */
#ifdef __cplusplus
extern "C" {
#endif

struct Test;

/* NB: This may be extern when imported by another module. */
struct Test make_Test(int x);

struct Test { int x; };

struct Test make_Test(int x)
{
struct Test r;
r.x = x;
return r;
}

#ifdef __cplusplus
}
#endif

使用 cl/c/Tpstest.c 编译会产生以下错误:

stest.c(8) : error C2526: 'make_Test' : C linkage function cannot return C++ class 'Test'
stest.c(6) : see declaration of 'Test'

在没有 /Tp 的情况下编译(它告诉 cl 将文件视为 C++)工作正常。该文件还可以在 C 和 C++ 模式下在 DigitalMars C 和 GCC(来自 mingw)中正常编译。我还在 GCC 中使用了 -ansi -pedantic -Wall 并且没有任何提示。

出于我将在下面讨论的原因,我们需要将此文件编译为 MSVC 的 C++(而不是其他的),但将函数编译为 C。本质上,我们需要一个普通的 C 编译器...除了大约六行。是否有一个开关或属性或我可以添加的东西可以让它工作?


有问题的代码(虽然不是上面的;这只是一个简化的例子)是由代码生成器生成的。

作为其中的一部分,我们需要能够生成浮点 nans 和无穷大作为常量(长话短说),这意味着我们必须在 C++ 模式下使用 MSVC 进行编译才能真正做到这一点.我们只找到了一种有效的解决方案,而且它在 C++ 模式下有效。

我们将代码包装在 extern "C"{...} 中,因为我们想要控制重整和调用约定,以便我们可以与现有的 C 代码交互。 ... 也因为我相信 C++ 编译器,只要我能扔掉一个小百货商店。我还尝试在 extern "C++"{...} 中包装 just reinterpret_cast 行,但这当然行不通。可惜。

我发现了一个潜在的解决方案,它需要重新排序声明,以便完整的结构定义出现在函数 foward 声明之前,但由于代码生成的执行方式,这非常不方便,所以我真的想尽可能避免走那条路。

最佳答案

这是一个有点棘手的错误消息,但调用者需要知道结构的大小才能进行调用。它需要在栈上为返回值预留空间。或者如果结构足够小,则期望寄存器中的返回值。

您必须在 header 中声明结构。当您这样做时,错误就会消失:

#ifdef __cplusplus
extern "C" {
#endif

struct Test { int x; };
struct Test make_Test(int x);

struct Test make_Test(int x)
{
struct Test r;
r.x = x;
return r;
}

#ifdef __cplusplus
}
#endif

关于c++ - 如何使用 MSVC 在 C++ 中定义外部 C 结构返回函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2718836/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com