在哪里下载C++ STL源代码 .h 和 .cpp 文件
Where to download C++ STLsource code both .h and .cpp files?
我从 http://www.sgi.com/tech/stl/download.html 下载了STL源代码,但它只有函数声明的.h。在哪里可以下载.cpp文件以读取实际实现?
例如,在 stl_multimap.h 或 stl_map.h 中,它具有:
template <class _Key, class _Tp, class _Compare, class _Alloc>
inline void swap(multimap<_Key,_Tp,_Compare,_Alloc>& __x,
multimap<_Key,_Tp,_Compare,_Alloc>& __y) {
__x.swap(__y);
}
我想知道交换的实际实现,如
__x.swap(__y);
我没有看到交换的实际代码在哪里。在这里,它只是自称。
.h文件包含实现。该页面上的许多标头只是其他标头的包装器或提供 typedefs,但是如果您查看像 stl_set.h
这样的文件,您会发现它具有 set
类的所有函数定义。
甚至页面本身也声明它是一个仅标题库,这意味着实现包含在标题中。
C++库的实现因不同的编译器/系统而异。如果您使用 GCC/G++ 作为编译器,您可以在此处从 http://gcc.gnu.org/libstdc++/下载源代码。
或者,您可以使用以下命令匿名签出源代码:
svn checkout svn://gcc.gnu.org/svn/gcc/trunk/libstdc++-v3 libstdc++
STL 是一个模板库。我希望您只能在头文件中找到实现。
不是别的。请注意,该页面显示:
STL 的这种分发完全由头文件组成:无需链接到任何库文件
实现都在头文件中。您必须使用模板来执行此操作。:-/
std_algobase.h
中找到swap
的实现。
SGI STL 文件名都以"stl_"开头。
例如,SGI 版本矢量的实现位于文件 stl_vector.h 中。
下面是文件stl_algobase.h内部交换和iter_swap的代码
// swap and iter_swap
template <class _ForwardIter1, class _ForwardIter2, class _Tp>
inline void __iter_swap(_ForwardIter1 __a, _ForwardIter2 __b, _Tp*) {
_Tp __tmp = *__a;
*__a = *__b;
*__b = __tmp;
}
template <class _ForwardIter1, class _ForwardIter2>
inline void iter_swap(_ForwardIter1 __a, _ForwardIter2 __b) {
__STL_REQUIRES(_ForwardIter1, _Mutable_ForwardIterator);
__STL_REQUIRES(_ForwardIter2, _Mutable_ForwardIterator);
__STL_CONVERTIBLE(typename iterator_traits<_ForwardIter1>::value_type,
typename iterator_traits<_ForwardIter2>::value_type);
__STL_CONVERTIBLE(typename iterator_traits<_ForwardIter2>::value_type,
typename iterator_traits<_ForwardIter1>::value_type);
__iter_swap(__a, __b, __VALUE_TYPE(__a));
}
template <class _Tp>
inline void swap(_Tp& __a, _Tp& __b) {
__STL_REQUIRES(_Tp, _Assignable);
_Tp __tmp = __a;
__a = __b;
__b = __tmp;
}
您不需要下载文件。您可以使用 STL,因此该库的某些版本必须位于计算机上的某个位置。这就引出了 Stackoverflow 上已经提出的另一个问题:C++标准库的标头在哪里。
您可以使用 bash 工具"定位"。"定位stl_multimap.h"对我来说会产生:
/usr/include/c++/5/bits/stl_multimap.h
/usr/include/c++/6/bits/stl_multimap.h
/usr/include/c++/7/bits/stl_multimap.h
/usr/include/c++/8/bits/stl_multimap.h
/usr/lib/gcc-snapshot/include/c++/9/bits/stl_multimap.h
一旦你看了目录,它应该变得非常明显,其他所有内容也在哪里。
在每个位置,我都会找到该文件的不同编译器版本。对于我的电脑,所有 gcc 7.* 文件都在我的/usr/include/c++/7
目录中。
如果出于某种可怕的原因你使用Windows,我相信你将能够找到与Powershell等效的命令。
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 命名空间中具有.h和.cpp文件的类
- 无法编译 rtmidi 测试 cmidiin.cpp 文件, 非法指令
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错
- 有充分的理由在h文件中使用include保护而不是cpp文件吗
- 如何在cpp文件之间切换窗口?在Qt中
- 在 .h 文件中的类中声明静态变量和在.cpp文件中声明"global"变量有什么区别
- 我有两个类需要在同一 cpp 文件中相互引用,但第一个类无法识别第二个类类型的对象
- .h 和.cpp文件分离时出错,但仅使用 .h 文件时没有错误.我做错了什么?
- 库标题在标题中不可见,但在 cmake build 下.cpp文件中完全可见.为什么?
- C++ 链接到单独的.cpp文件说"multiple definitions"
- 在 cpp 文件中隐藏采用模板参数引用的方法
- 如何使用 samtools C API 构建一个简单的主.cpp文件
- 包含在.cpp文件中包含在 .h 文件时包含
- C++(.cpp文件和.h文件)拆分代码并添加一个函数,提取 - 这很容易吗?
- 在头文件和 cpp 文件中使用一次 #pragma 时出现结构重定义错误
- 如何使用线程类编译 cpp 文件?
- 使用 Powershell 命令将 cpp 文件的文件夹编译为 GNU 的 g++
- 我应该将外部标头放在 .h 文件还是.cpp文件中?
- 从另一个 cpp 文件更改结构内、映射键内的变量