g++ :--std 选项应该更改我的代码使用的 STL/stdlib 吗?
g++ : should --std option change which STL/stdlib my code uses?
我很困惑最近的 g++(例如 4.8 或 4.9)是否应该根据所选的 --std 选项引用不同的 STL。具体来说,给定选项 --std=c++98 vs --std=c++11,在那种情况下我的代码 see/use 不应该是两个不同的 STL 吗?然而,当我使用 c++98 选项编译时,似乎我仍在获取最新的 STL,这显然不起作用,因为它使用了许多仅 c++11 的东西。我在我的系统上搜索过,只找到了一份 STL 头文件(c++11 的)。感谢任何关于它应该如何工作的澄清。
当然可以。 功能上。
但是,在实践中,您的实现可能会在它们之间共享相同的标准库实现代码,使用宏来打开和关闭功能。 GCC 就是这样做的。
如果您打开其中一些 headers,那么您会在 bits/stl_algo.h
中看到类似这样的开关
#if __cplusplus >= 201103L
/**
* @brief Checks that a predicate is true for all the elements
* of a sequence.
* @ingroup non_mutating_algorithms
* @param __first An input iterator.
* @param __last An input iterator.
* @param __pred A predicate.
* @return True if the check is true, false otherwise.
*
* Returns true if @p __pred is true for each element in the range
* @p [__first,__last), and false otherwise.
*/
template<typename _InputIterator, typename _Predicate>
inline bool
all_of(_InputIterator __first, _InputIterator __last, _Predicate __pred)
{ return __last == std::find_if_not(__first, __last, __pred); }
...
#endif
实现必须为不同的 -std
开关设置维护这些文件的不同副本是荒谬的。
我很困惑最近的 g++(例如 4.8 或 4.9)是否应该根据所选的 --std 选项引用不同的 STL。具体来说,给定选项 --std=c++98 vs --std=c++11,在那种情况下我的代码 see/use 不应该是两个不同的 STL 吗?然而,当我使用 c++98 选项编译时,似乎我仍在获取最新的 STL,这显然不起作用,因为它使用了许多仅 c++11 的东西。我在我的系统上搜索过,只找到了一份 STL 头文件(c++11 的)。感谢任何关于它应该如何工作的澄清。
当然可以。 功能上。
但是,在实践中,您的实现可能会在它们之间共享相同的标准库实现代码,使用宏来打开和关闭功能。 GCC 就是这样做的。
如果您打开其中一些 headers,那么您会在 bits/stl_algo.h
#if __cplusplus >= 201103L
/**
* @brief Checks that a predicate is true for all the elements
* of a sequence.
* @ingroup non_mutating_algorithms
* @param __first An input iterator.
* @param __last An input iterator.
* @param __pred A predicate.
* @return True if the check is true, false otherwise.
*
* Returns true if @p __pred is true for each element in the range
* @p [__first,__last), and false otherwise.
*/
template<typename _InputIterator, typename _Predicate>
inline bool
all_of(_InputIterator __first, _InputIterator __last, _Predicate __pred)
{ return __last == std::find_if_not(__first, __last, __pred); }
...
#endif
实现必须为不同的 -std
开关设置维护这些文件的不同副本是荒谬的。