我可以创建 `extern "c"` 函数吗?

5

我有一些cpp文件,想使用FFI将它们与LuaJit组合起来。

但问题是,我必须为几乎每个函数添加extern "c"符号,让FFI可以访问它们。

是否有更简单的方法来完成这个任务?


7
你可以将所有函数放在一个 extern C 块中进行分组。这样就足够了吗? - Jean-François Fabre
1
这些cpp文件不是我创建的,除了它们的功能,我一无所知。我只想通过Lua来使用它们。 - Zehui Lin
@Serhio所以并非所有的函数都可以标记为extern "C"吗?那么如果我想在我的Lua项目中使用开源cpp文件,这将会非常困难。 - Zehui Lin
2
@ZehuiLin,你可以将任何想要的函数标记为 extern "C",但这并不意味着所有标记的函数都是与 C 兼容的。 - Sergio
1
感谢您的建议。我已经阅读了代码,并发现可以为其添加一个 extern "C" 块。现在似乎正常工作了。 - Zehui Lin
显示剩余2条评论
3个回答

0
虽然它不具备可移植性,但你可以实现一个函数签名,并使用名称修饰协议生成修饰后的名称,以便在 FFI 中找到符号名称。
Linux 上的 Gcc 和 Clang 使用 Itanium C++ ABI 名称修饰规则,可以在这里找到链接
在 Windows 上,MSVC 使用一种未记录的名称修饰方案。

0

是的。定义一个简单、最小化的包装 API 并导出它:

// NOTE: Exported functions do heavy parley and medical-research leveraging C++ under the hood (and only and the hood).
extern "C" {
  void achieve_world_peace(void);

  void treat_cancer(void);
}

0

多个函数可以放置在单个extern "C"块中。这使您可以为每个头文件仅键入一次extern "C"

extern "C" {
    void function1();
    void function2();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接