在 C++ 中实现 C 库函数

Posted

技术标签:

【中文标题】在 C++ 中实现 C 库函数【英文标题】:Implementing C library function in C++ 【发布时间】:2011-10-14 16:56:15 【问题描述】:

在 C++ 中实现 C 库有什么缺点?该库将用于使用 Visual Studio 2008 或更新版本为普通 PC 构建 Windows 应用程序。目前尚不清楚为什么规范声明它应该是 C 库。我猜他们想要的是纯 C-API,而不是纯 C lib。但我的老板不同意。

无论如何,我想做的就是extern "C"所有函数声明,并在实现文件中使用C++。我做了一些测试,即使应用程序被编译为 C(通过更改 Visual Studio 中的项目选项),一切正常。

【问题讨论】:

我认为您需要询问您的客户他们的意思。如果他们打算在没有 libsdtc++ 的嵌入式设备上使用这个库,那你就完蛋了。 我并不特别了解 Visual Studio,但一般来说,如果要将库链接到 C 程序,在 C++ 中创建它(使用 extern "c" 声明)可能会导致问题,除非链接器知道执行 C++ 启动。如果您可能需要将其作为 C 友好库移植到另一个编译器,那么在纯 C 中实现可能是一个更安全的决定。 顺便说一句,我同意你的看法。你的老板认为客户会关心编译代码的源语言而不是所述代码的 API,这让我想知道他是如何成为任何人的老板。 @Tomalak:C++ 库可能需要 C++ 运行时,可能还需要 C++ 初始化,这使得它们在 C 程序中不受欢迎。如果我要求一个 C 库并得到一个带有包装器的 C++ 库,我会很不高兴。 另一个例子:如果客户要接收源代码,他们可能希望用 C 语言来理解它。 【参考方案1】:

我见过有人这样做是为了将 STL 集合暴露给 C 程序。如果您确定该库将仅在具有健全 C/C++ 编译器的环境中使用(例如,仅 VS 和 gcc),我认为从技术角度来看这是一件非常安全的事情。 ñ 哦,听起来你在这里有某种外部要求,但显然我们不能对此发表评论。对需求源进行双重检查可能会更糟?

更新:哦,我应该提到它会影响您的库所需的 DLL。除了 CRT 之外,还需要加载 C++ 运行时 DLL。

【讨论】:

【参考方案2】:

extern c 一直用于将某些功能从 c 移植到 c++。例如,new 运算符又从 std c 调用 malloc()。这是 c 库被赋予 c++ 外观的一个很好的例子。 new 运算符使分配内存变得更加容易,除此之外,它还允许许多功能,例如在 c 中不可用的运算符重载。我的猜测是添加更多功能并制作整洁的界面。

如果您正在考虑缺点,那么它可能是相关的编译器特定问题,其中为 c++ 程序生成的 ABL 与 C 的不同,如果编译器无法区分两者,那么您就遇到了。

我不确定这是否是您正在寻找的,如果不是,请尝试此链接,它可能会有所帮助。

http://www.informit.com/guides/content.aspx?g=cplusplus&seqNum=180

【讨论】:

【参考方案3】:

如果他们打算将它用于 C 程序,即 main() 函数是由 C 编译器编译的,那么您必须非常小心地使用您的 C++ 库。问题是 c 程序不会为静态变量执行任何构造函数。因此,您必须在构造函数中省略任何静态变量的使用。这对您的库本身来说很容易,但您必须检查对库 C++ 函数的每次调用是否依赖于静态初始化变量的存在(例如 std::coutstd::cin 等)。

【讨论】:

以上是关于在 C++ 中实现 C 库函数的主要内容,如果未能解决你的问题,请参考以下文章

你如何在 C++ 中实现阶乘函数? [复制]

什么是 C 和 C ++ 标准库?

c++ c语言 - 控件及概述补充

什么是 C 和 C++ 标准库?

你真的了解 C 和 C++ 标准库吗?

在 Java 中实现“系统”命令