C库的一个端口需要在C中实现吗?
Does a port of the C library need to be implemented in C?
我正在开发一个内核。编写内核的任务之一是必须移植C库。有些函数如memcmp
、strlen
等需要重写。大多数时候,我看到的代码是用C写的,然后用extern "C"
包装。然而,这使我的构建过程变得复杂,因为有很多用C编写的文件,还有很多用c++编写的文件,这些文件必须链接在一起,这真是令人头疼。如果整个程序都能用c++写就好了。
这有意义吗?
如果该端口仅用于您的内核,那么您可以很好地做任何您想做的事情。如果您计划向内核用户提供对该库的访问权限,那么接口必须是c。然而,实现可以是您想要的任何语言。
现在对于大多数函数来说,使用c++函数然后创建一个C函数来访问c++函数并没有多大意义,因为函数本身不会使用c++(至少对于strlen()
这样的函数,你不需要真正使用std::find()
,你可以用一个简单的循环在C中重写)。
您还可以重用GNU C库中需要的函数。也就是说,把这些函数复制到你的实现中。只要确保你的驾照是一样的。为了提高速度,该库用各种汇编语言实现了许多这样的低级函数。例如,strlen()
函数加载64位,并使用逻辑(NOT
, AND
, XOR
…)确定是否存在0x00字节,这使得该函数非常高效。
GNU C库还包括调用内核函数的特殊函数。显然,你不会想要这些直接在你的内核中(好吧,可能不会,这取决于你的内核)。
最后,C库比strlen()
等几个函数要复杂得多。它必须与成千上万的软件一起工作,所有这些软件都可能与略有不同的版本相关联。因此,strlen()
实际上可能在同一个C库中有20个版本。在一段时间内(直到您的内核被许多人使用之前),您可能不会想要担心这个问题,但是对于在您的计算机上运行的软件的长期稳定性来说,它可能很重要。如果一个软件期望某个函数返回EINVAL
(旧版本),而另一个软件期望返回EIO
(新版本),这一点尤其重要。在处理成千上万的软件时,这种微小的差异是非常重要的。
再一次,听起来你的意思是在内核中有帮助函数。辅助函数在C库中可用,但不是实际的C库(我不认为内核以这种方式链接是一个好主意)。它应该是特定于内核的辅助函数库,您可以静态链接它。实际上,您应该只添加内核使用的函数,而不是更多。
最后,如果您的内核是用c++编写的,那么您的辅助函数也可以用c++编写。然而,如果你打算有一些小的部分只使用C语言,并且这些小的部分将使用一些辅助函数,那么用C语言编写这些辅助函数将会更容易。strlen()
显然只在C语言中是必需的,因为在c++中你想使用std::string::length()
成员函数来代替。
- 实现一个在集合上迭代的模板函数
- 如何为位集找到/实现一个好的哈希函数
- C++:实现一个全局常量,其值由用户给出
- C++:实现一个接收lambda作为输入的高阶函数
- 如何实现一个接受任何容器类型的函数
- 使用无符号int作为二进制来在c++中实现一个集
- 在int main()[c++]中实现一个递归函数
- 为什么T是未定义的?我正在尝试实现一个用于双链表的节点类,它不喜欢我使用友元运算符后的T
- 实现一个函数,该函数将字符串作为输入并返回一个新字符串,辅音字母不替换为 "!"
- 实现一个想要模拟 std::string 但在将其push_back向量时卡住的类
- 为 RocksDB 实现一个比较器
- 在使用表达模板的矩阵库中实现一个行类别的分配运算符
- 我需要实现一个指向成员函数重载的 c++ 函数指针
- 如何实现一个奇怪的循环
- 实现一个函数 StrSep(s, sub, part1, part2) 来接收字符串和子字符串 (sub) 并返回 :
- 我正在尝试为 Kruskal 算法实现一个C++程序,该程序需要我按权重对图形进行排序。如何按权重对结构进行排序
- 实现一个通用堆栈容器作为适配器类模板
- 如何用decltype实现一个不太通用的std::is_constructible
- 有可能实现一个与数组而不是单个对象一起工作的内存池吗
- QTextEdit 实现一个 onlclick 事件