将C ++代码作为C API公开公开意味着什么?这样做的好处是什么?


25

我经常听到人们说C ++程序员应该将其库/产品的公共API公开为C API。

这是什么意思,它的优点是什么?

Answers:


44

这确实意味着您的库中作为接口公开的部分仅使用语言的C“部分”,因此您不会导出类或类似的类,而仅导出函数,POD和包含POD的结构。另外,您必须禁用C ++名称修饰,通常通过将功能标记为来实现extern "C"。一个典型的例子是:

extern "C" void foo(int bar);

以这种方式公开库的最大优点是,几乎每种编程语言都具有直接与C库接口的机制,但是只有极少数人可以直接与C ++库接口。因此,从这个意义上讲,您选择了最小的公分母来简化他人使用您的库的工作。

但是请记住,如果您正在创建供其他人使用的库,那么这实际上只是一个有用的策略。如果您正在构建一个仅C ++的软件,并且这些库仅需要相互连接,则(IMHO)最好公开适当的C ++ API,以便可以充分利用该语言的功能。


14
您也必须注意不要导出抛出的异常!
2013年

那是一个很好的答案。能给我一个extern "C"我没得到的东西的例子吗?
Daniel Ribeiro

1
@DanielRibeiro:只是用谷歌搜索“ extern C”。你会发现像这样的链接:stackoverflow.com/questions/1041866/...
布朗博士

1
@DanielRibeiro,添加了非常简单的示例。
Timo Geusch 2013年

1
@DanielRibeiro从技术上讲,仍然可以使用.hpp,但是此扩展名表示“ C ++头文件”,因此应为.h,用于C和C ++。
leemes 2013年

8

除了Timo的回答之外-在某些平台上(例如Windows-诸如广泛采用的Mac OS X的Linux),没有标准化的C ++ ABI,因此,这不仅是缺少功能的问题,而且也不可能实现该功能。

例如,IIRC MSVC在每个版本中都有不同的ABI,并且它可能是调试版本还是发行版本,因此可能会发生变化-并且未发布,因此第三方编译器通常不兼容(我读到一些信息,指出icc的某些版本与MSVC兼容2005年,但可能是根据NDA披露的信息-诸如Python的创建者没有必要使用并使用自己的ABI。因此在实践中,语言环境不仅会限制编译器版本,还会限制标志。

最后,C ++具有更多的编译时功能。例如,泛型通常不存在于动态类型语言等中。


2
@DanielRibeiro:欢迎来到C ++ ABI的绝妙世界(en.wikipedia.org/wiki/Application_binary_interface)。简短的版本是很难使C ++组件单独编译(与不同的编译器/标志编译)在一起工作,而不是静默地失败/崩溃。
Maciej Piechotka
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.