【问题标题】:Does a port of the C library need to be implemented in C?C 库的一个端口是否需要在 C 中实现?
【发布时间】:2015-10-15 03:30:54
【问题描述】:

我正在开发内核。编写内核的任务之一是必须移植 C 库。 memcmpstrlen等一些函数需要重写。大多数时候我看到的代码是用 C 编写的,然后包装在 extern "C" 中。但是,这使我的构建过程变得复杂,因为有很多用 C 编写的文件,还有很多用 C++ 编写的文件,它们必须链接在一起,这只是一个令人头疼的问题。如果整个东西都可以用 C++ 编写,那就太好了。

这有意义吗?

【问题讨论】:

  • 从 C++ 标准的角度来看,您可以在 COBOL 中实现标准库,只要它符合标准的要求。
  • 混合C++C 库应该不是问题。你能澄清你的问题吗?
  • 我不完全确定 stdlib/libc 与内核有什么关系,但如果你想 C(或汇编)代码与你的库链接,则需要编译函数extern "C" 所以你没有 C++ 名称修改问题。
  • “编写内核的任务之一是必须移植 C 库。” - 不,如果你愿意,你可以编写一个没有 C 库的内核,或者使用完全不同的东西。这取决于你。
  • 您想在内核代码中使用它,还是将它提供给用户应用程序?无论哪种方式,只要最终你有一个包含所需符号、正确调用约定和每个符号背后的标准化行为的目标文件,你就可以用几乎任何你喜欢的语言编写 C 库。 extern "C" 只需要阻止 C++ 编译器尝试搜索损坏的名称,因此它只需要在函数的声明周围。

标签: c++ c freestanding


【解决方案1】:

如果该端口仅用于您的内核,那么您可以随心所欲地做任何事情。如果您计划向内核用户提供对该库的访问权限,则接口必须是 C。但是,实现可以是您想要的任何语言。

现在对于大多数函数,使用 C++ 函数然后创建 C 函数来访问 C++ 函数没有多大意义,因为函数本身不会使用 C++(至少对于 @987654321 等函数) @,你真的不需要使用std::find(),你可以用一个简单的循环在C中重写它)。

您还可以从 GNU C 库中重用您需要的函数。即只需将这些功能复制到您的实现中。只要确保保持相同的许可证。该库在各种汇编语言中具有许多此类低级函数的实现以提高速度。例如,strlen() 函数加载 64 位并使用逻辑(NOTANDXOR...)确定是否存在 0x00 字节,这使得该函数非常高效。

GNU C 库还包括调用内核函数的特殊函数。显然,您不希望直接在内核中使用这些(嗯,可能不会,这将取决于您的内核)。

最后,C 库比 strlen() 这样的几个函数复杂得多。它必须与数以千计的软件一起工作,所有这些软件都可能与略有不同的版本相关联。所以strlen() 在同一个 C 库中实际上可能有 20 个版本。您可能暂时不想担心(直到您的内核被许多人使用),但这对于计算机上运行的软件的长期稳定性可能很重要。如果一个软件希望某个函数返回EINVAL(旧版本)而另一个返回EIO(新版本),这一点尤其重要。在处理数以千计的软件时,如此微小的差异非常重要。

再一次,听起来你的意思是在你的内核中有辅助函数。在 C 库中可用但不是实际 C 库的辅助函数(我认为以这种方式链接内核不是一个好主意)。它应该是您的内核特定的辅助函数库,您可以静态链接。实际上,您应该只添加内核使用的函数,仅此而已。

最后,如果您的内核是用 C++ 编写的,那么您的辅助函数也可以用 C++ 编写。但是,如果您计划有一些只使用 C 的小部件,并且其中一些辅助函数将用于这些小部件,那么用 C 编写这些辅助函数会更容易。 strlen() 显然只在 C 中是必需的,因为在 C++ 中,您希望使用函数的 std::string::length() 成员。

【讨论】:

  • 注意:You could also reuse the functions you need from the GNU C library. i.e. just copy those functions to your implementation,然后遵循 GNU C 库获得许可的 GNU 通用公共许可证,这对于内核基本上意味着它必须是开源的。
  • @KamilCuk 是的,差不多。 OP 没有具体说明是需要采用一种方式还是另一种方式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-11
  • 1970-01-01
  • 1970-01-01
  • 2022-12-08
  • 1970-01-01
相关资源
最近更新 更多