12

通过反复试验引起了我的注意,有些 C++11 特性依赖于某种编译器魔法 (TM)。我一直在搞乱实现我自己的标准符合标准的stdlib。我知道有现成的标准库实现,但这个更多是我自己的小型应用程序的个人版本。

昨晚我std::initializer_list根据规范实现了,但我无法让它工作,我搜索了高和低的答案,只留下了不可能的声明,并且需要对编译器本身进行修改。好吧,我决定看看libstdc++它的当前实现,果然我的实现在设计上完全一样,只是边缘略有不同,我浪费了无意义的时间来弄清楚为什么实现不工作,当它完全正确时在设计上与中的相同libstdc++。直到六个小时后,我才意识到它必须在命名空间 std 中。原来实现是 merley 的编译器的代理,这使得这成为initializer_list可能,编译器本身initializer_listnamespace std.

我的问题是我应该知道是否还有其他库功能需要某种特殊的编译器魔法才能工作,是否需要更多隐藏的代理连接,或者为任何新的 C++11 库功能隐藏编译器本质?我想提前知道这些,这样我就可以为实现其他依赖于编译器魔法的功能做好准备,而不是浪费一整天的时间通过反复试验来解决它;这可能会变得乏味且相当烦人。

谢谢。

4

2 回答 2

11

中的函数<exception>主要是编译器的钩子。

如果没有编译器的帮助,几个<type_traits>属性查询是不可能或很难实现的。即使那些仅仅是困难的也可能由于“作弊”而导致编译器的本机 stdlib 成功。当然,它们也会编译得更快。

尽管可以这样编写<iostream>cincout第一次使用时自动初始化,但大多数编译器选择欺骗和链接它们,以便它们首先在静态初始化中。

<typeinfo>,当然,必须与编译器期望的完全匹配。

可能还有更多我不知道或想不到的事情。

除了标准库“作弊”和依赖编译器外,编译器还可能依赖标准库中存在的非标准函数。因此,即使您实现了所有标准功能,您也可能必须复制粘贴例程来遍历异常表、处理虚拟析构函数中的层次结构等。

于 2011-09-11T23:24:34.847 回答
5

所有“魔法”类型,即编译器所需的类型,都列在 C++ 规范中称为“语言支持库”的特殊部分中。显然,如果您正在实现 C++ 标准库,您应该手边有一份标准副本。初始化列表以及type_info, <cstdint>, 全局运算符 new/delete,<exception>等等都在该部分中。

不要试图实现这些;使用编译器给你的东西。

于 2011-09-12T00:34:18.013 回答