C++11 库功能依赖于编译器特定的代理

问题描述 投票:0回答:2

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

昨晚我根据规范实现了

std::initializer_list
,但我在使其工作时遇到了麻烦,我四处寻找答案,结果却留下了这样的陈述:这是不可能的,并且需要对编译器本身进行修改。 好吧,我决定看一下它当前的
libstdc++
实现,果然我的实现在设计上完全相同,只是边缘略有不同,我浪费了毫无意义的时间来弄清楚为什么实现不起作用,当它的设计与
libstdc++
中的一模一样。 直到六个小时后我才意识到它必须位于命名空间 std 中。 事实证明,该实现是 merley 编译器的代理,这使得
initializer_list
成为可能,并且编译器本身会在
initializer_list
中搜索
namespace std
类。

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

谢谢。

c++ c++11 std initializer-list
2个回答
11
投票

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

如果没有编译器的帮助,一些

<type_traits>

 属性查询是不可能或很难实现的。即使只是困难的那些也可能在编译器的本机 stdlib 由于“作弊”而成功的情况下发生故障。当然,它们的编译速度也会更快。

虽然可以编写

<iostream>

 使得 
cin
cout
 在第一次使用时自动初始化,但大多数编译器选择欺骗并链接它们,以便它们首先进行静态初始化。

<typeinfo>

,当然,必须完全符合编译器的期望。

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

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


5
投票
编译器所需的所有“神奇”类型都列在 C++ 规范中名为“语言支持库”的特殊部分中。显然,如果您正在实现 C++ 标准库,那么您应该手头有一份标准的副本。初始化列表位于该部分,还有

type_info

<cstdint>
、全局运算符 new/delete、
<exception>
 等等。

不要尝试实施这些;使用编译器为您提供的内容。

© www.soinside.com 2019 - 2024. All rights reserved.