作为一个C++初级程序员,我注意到无论您使用什么IDE/编译器,您都不需要显式地包含stl (标准模板库)。这是否意味着我可以依赖stl“始终可用”?
例如,如果我想使用std::cout,我只包含stl的iostream部分:
#include <iostream>...and不需要首先执行类似#include <std>的操作就可以继续这样的操作:
std::cout << "Hello world!" << std::endl;此外:我可以依赖于stl的一致性吗?stl的每个函数/方法都有相同的行为吗?或者C++发行版、操作系统或编译器之间是否有任何更改?
我之所以这样问,是因为当你不知道某些陷阱的时候,其他库有时真的会很痛苦。例如,特征(用于线性代数的东西)对我来说真的很难开始,我注意到一些版本之间的变化行为。
发布于 2017-03-20 21:42:56
是的,尽管对于只允许提供子集的独立实现有特殊的允许,但C++标准库必须随每个C++编译器一起提供,因为它是语言规范的一部分。(最初作为C++的扩展,最初被称为标准模板库,但现在更好的术语是C++标准库。)
C++标准库指定得非常好--您总是需要包含各种头文件才能引入标准库组件。所需的标头不会从编译器更改为编译器。在这方面,它是机器独立的。
随着标准的发展,哲学是尽量减少兼容性中断,但也有一些:例如,在C++11中对auto关键字的重新定义,以及从该标准开始对std::auto_ptr的否定。
大多数组件确实在保留的命名空间std中--有些函数不是因为遗留原因。最后,最好显式地使用std::,而不是通过使用
using namespace std;否则,您将使代码易受命名空间歧义的影响。
发布于 2017-03-20 23:06:09
几乎所有的C++编译器都将附带标准C++库。这些被称为“托管实现”。库定义得很好,虽然它确实在增长,但很少会以破坏旧代码的方式进行更改。标准委员会的一个主要目标是保持向后兼容性。
该标准还允许“独立实现”,它附带了一个非常精简的库,完全在标头中实现。在为嵌入式系统开发代码时,您可能会遇到这种情况,特别是当该系统没有底层操作系统时。这些是罕见的,但它们确实存在。(第7.6.1.13节讨论了独立实现。)
发布于 2017-03-20 21:57:57
这是否意味着我可以依赖stl“始终可用”?
是的,标准库是C++语言的一部分。因此,它保证它将“始终可用”与任何C++编译器。
我能依赖于STL的一致性吗?
是的,当然。C++标准库是聪明的头脑们的精力充沛的努力,他们为我们带来了痛苦,使我们不能时不时地重新发明轮子,或者不得不相信第三方库,因为它们最终可能会把你甩在后面。它尽可能由成员组成,并尽可能泛泛。
STL的每个函数/方法都有相同的行为吗?或者C++发行版、操作系统或编译器之间是否有任何更改?
C++标准库在C++标准中进行了描述。因此,可以保证在符合C++标准的编译器中,C++标准库的功能获得相同的行为,即标准兼容行为。C++发行版之间有一些更改(例如,附加功能),但向后兼容性得到了保证。也就是说,用C++98编写的代码仍然可以编译,现代的C++编译器支持C++17 (少数例外)。
我之所以这样问,是因为当你不知道某些陷阱的时候,其他库有时真的会很痛苦。
通常,鼓励您尽可能使用C++标准库,并避免提供与标准库相同功能的第三方库。这是由于许多原因,其中一些原因是:
https://stackoverflow.com/questions/42914351
复制相似问题