【问题标题】:Access inline C++ function from C从 C 访问内联 C++ 函数
【发布时间】:2023-01-17 22:13:09
【问题描述】:

我正在尝试为 C++ 创建 C 函数包装器,我的目标是使它们内联。网上所有的解决方案都说在库中制作内联函数时,只需将函数定义放在头文件中即可。但这在这种情况下不起作用,因为函数包含只能在 C++ 中编译的代码。

这个例子演示了这种情况:

// box_c.cpp
#include "box.h"

extern "C" Square *new_Square(int width, int height){
    return new Square(width, height);
}



// box_c.h
void *new_Square(int width, int height);



// main.c
#include "box_c.h"

int main(void){
    void *s = new_Square(5, 5);
}


在这种情况下是否可以使 new_Square 内联? (包装器是一个静态库)。

【问题讨论】:

  • box_c.h 应该保护自己免受标头保护的递归包含。它还应检查是否编译为 C 或 C++,如果编译为 C++,则应具有 extern "C" { ... }。您应该编译此代码以确保您的示例有效。
  • 无论内联与否,您的示例都无法工作,因为同一个函数不能同时返回 Square *void *
  • @Eljay 这是一个粗略的例子,所以我错过了很多细节。我的意思是在包装器源代码中包含“extern“C””,并在标题中包含 gaurds。

标签: c++ c


【解决方案1】:

内联意味着内联源代码的编译器需要在某种程度上理解它。 C 编译器不理解 C++ new。你不能这样做。让它保持非内联,这样就可以链接代码的编译版本,而不需要编译器本身就理解 C++。

如果代码(库和最终可执行文件)是在启用 LTO 的情况下编译的,则链接器可能会在此时内联代码,但这并不能保证。

【讨论】:

    【解决方案2】:

    显然,通常你不能在 C 代码中内联 C++ 代码,它们是两种不同的语言。

    所以,要么

    • 强制导出已编译库中的 C++ 函数,

    • 确保 C++ 函数与 C 代码兼容,并将其作为内联保留在头文件中。

    【讨论】:

    • 我无法使 C++ 函数代码与 C 兼容,因为我试图包装一个我无法控制的第 3 方库。我将如何在编译的二进制文件中强制导出 C++ 函数?
    猜你喜欢
    • 2017-01-05
    • 2011-08-23
    • 1970-01-01
    • 2012-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多