我正在研究内核。编写内核的任务之一是必须移植 C 库。必须重写一些函数,例如memcmp
,strlen
等等。大多数时候我会看到用 C 编写的代码,然后用extern "C"
. 但是,这使我的构建过程变得复杂,因为有很多用 C 编写的文件,还有很多用 C++ 编写的文件,它们必须链接在一起,这只是一个令人头疼的问题。如果整个东西都可以用 C++ 编写,那就太好了。
这有意义吗?
我正在研究内核。编写内核的任务之一是必须移植 C 库。必须重写一些函数,例如memcmp
,strlen
等等。大多数时候我会看到用 C 编写的代码,然后用extern "C"
. 但是,这使我的构建过程变得复杂,因为有很多用 C 编写的文件,还有很多用 C++ 编写的文件,它们必须链接在一起,这只是一个令人头疼的问题。如果整个东西都可以用 C++ 编写,那就太好了。
这有意义吗?
如果该端口仅用于您的内核,那么您可以随心所欲地做任何事情。如果您计划向内核用户提供对该库的访问,那么接口必须是 C。但是,实现可以是您想要的任何语言。
现在对于大多数函数来说,使用 C++ 函数然后创建一个 C 函数来访问 C++ 函数没有多大意义,因为函数本身不会使用 C++(至少对于诸如 之类的函数strlen()
,你不会真的需要使用std::find()
,你可以用一个简单的循环在 C 中重写它)。
您还可以重用 GNU C 库中所需的函数。即只需将这些功能复制到您的实现中。只要确保保持相同的许可证。该库在各种汇编语言中具有许多此类低级函数的实现以提高速度。例如,该函数加载 64 位并使用逻辑 ( , , ...)strlen()
确定是否存在 0x00 字节,这使得该函数非常高效。NOT
AND
XOR
GNU C 库还包括调用内核函数的特殊函数。显然,您不希望直接在内核中使用这些(嗯,可能不会,这将取决于您的内核)。
最后,C 库比仅几个函数(如strlen()
. 它必须与数以千计的软件一起工作,所有这些软件都可能与略有不同的版本相关联。所以strlen()
实际上可能在同一个 C 库中有 20 个版本。您可能暂时不想担心(直到您的内核被许多人使用),但这对于计算机上运行的软件的长期稳定性可能很重要。如果一个软件期望某个函数返回EINVAL
(旧版本)而另一个返回EIO
(新版本),这一点尤其重要。在处理成千上万的软件时,如此微小的差异非常重要。
再一次,听起来你的意思是在你的内核中有辅助函数。在 C 库中可用但不是实际 C 库的辅助函数(我认为以这种方式链接内核不是一个好主意)。它应该是您的内核特定的辅助函数库,您可以静态链接。实际上,您应该只添加内核使用的函数,仅此而已。
最后,如果您的内核是用 C++ 编写的,那么您的辅助函数也可以用 C++ 编写。但是,如果您计划有一些仅使用 C 的小部件,并且其中一些辅助函数将用于这些小部件,那么用 C 编写这些辅助函数会更容易。strlen()
显然只在 C 中是必需的,因为在 C++ 中你想使用std::string::length()
函数的成员。