9

我可以在 C++ 独立环境中使用哪些功能?我正在开发一个小内核(为了我自己的乐趣),我知道我不能使用整个 stdlib 库,但还有什么?当我尝试使用 new 和 delete 运算符时,它编译时没有问题,但链接器说

undefined reference to `operator new[](unsigned long)
undefined reference to `operator delete[](void*)'

我链接-lgcc-lsupc++选项。我知道异常处理在独立中是禁用的,但我有点惊讶 new 和 delete 也是。那么我可以使用什么,不能使用什么?

4

1 回答 1

10

我可以在 C++ 独立环境中使用哪些功能?

许多独立的实现是实现定义的:

[intro.compliance] ... 独立的实现是在没有操作系统利益的情况下执行的实现,并且具有一组实现定义的库,其中包括某些语言支持库

[intro.multithread] ...在独立实现下,程序是否可以有多个执行线程是由实现定义的。

[basic.start.main] 独立环境中的程序是否需要定义main函数是实现定义的。[注意:在独立环境中,启动和终止是实现定义的;启动包含执行具有静态存储持续时间的命名空间范围对象的构造函数;终止包含对具有静态存储持续时间的对象执行析构函数。——尾注]

[using.headers] 用于独立实现的 C++ 头文件

<ciso646>
<cstddef>
<cfloat>
<limits>
<climits>
<cstdint>
<cstdlib>
<new>
<typeinfo>
<exception>
<initializer_list>
<cstdalign>
<cstdarg>
<cstdbool>
<atomic>

[合规性] 提供的标头版本<cstdlib>应至少声明函数 abort、atexit、at_quick_-exit、exit 和 quick_exit (18.5)。此表中列出的其他标头应满足与托管实现相同的要求。

请注意,malloc/free未列在所需的功能中<cstdlib>


就您的链接器错误而言,既不需要独立实现也不需要托管实现来提供这些重载:

[replacement.functions] AC ++ 程序可以为头文件中声明的十二个动态内存分配函数签名中的任何一个提供定义<new>

在实践中,由于独立环境不能依赖于操作系统,并且malloc通常使用操作系统提供的功能来实现,因此独立环境中不太可能具有自由存储内存管理功能。相反,托管环境需要免费的存储内存管理来实现标准库的功能。

于 2017-02-24T15:19:43.263 回答