【问题标题】:Where to download C++ STLsource code both .h and .cpp files?在哪里下载 .h 和 .cpp 文件的 C++ STL 源代码?
【发布时间】:2011-05-11 05:07:30
【问题描述】:

我从 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);

我看不到交换的实际代码在哪里。在这里,它只是调用自己。

【问题讨论】:

  • 它没有在里面自称,与你的最后一句话相反。
  • 你为什么要下载这个源代码?您的 C++ 标准库带有当今唯一真正重要的 STL 版本。

标签: c++ stl


【解决方案1】:

.h 文件包含实现。该页面上的许多标题只是对其他标题的包装或提供类型定义,但如果您查看像 stl_set.h 这样的文件,您会发现它包含 set 类的所有函数定义。

甚至页面本身都声明它是一个仅标题库,这意味着实现包含在标题中。

【讨论】:

  • 根据您和其他人的答案,我猜该实现是特定于编译器的。我想我应该在 g++ 编译器中找到实现,也许。
  • @Amumu:你误会了。实现在 .h 文件中。没有一些特定于编译器的 .cpp 文件或包含实现的东西。整个实现在头文件中。所有的。您不需要其他任何东西。
【解决方案2】:

C++ 库的实现在不同的编译器/系统上有所不同。 如果您使用 GCC/G++ 作为编译器,您可以在此处从http://gcc.gnu.org/libstdc++/ 下载源代码。

或者您可以使用以下命令匿名签出源代码

svn checkout svn://gcc.gnu.org/svn/gcc/trunk/libstdc++-v3 libstdc++

【讨论】:

    【解决方案3】:

    STL 是一个模板库。我希望你只会在头文件中找到实现。

    【讨论】:

      【解决方案4】:

      这不是别的。请注意,页面显示:

      此 STL 分发完全由头文件组成:无需链接到任何库文件

      【讨论】:

        【解决方案5】:

        实现都在头文件中。您必须使用模板来做到这一点。 :-/

        【讨论】:

        • 好吧,我找不到一些实现,例如map和multimap中的交换功能。
        【解决方案6】:

        您可以在std_algobase.h 中找到swap 的实现。

        【讨论】:

          【解决方案7】:

          SGI STL 文件名都以“stl_”开头。

          例如,SGI 版本向量的实现在文件 stl_vector.h 中。

          【讨论】:

            【解决方案8】:

            以下是文件 stl_algobase.h 中 swap 和 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;
            }
            

            【讨论】:

              【解决方案9】:

              您无需下载文件。您可以使用 STL,因此某些版本的库必须在您计算机上的某个位置。这导致了 Stackoverflow 上已经提出的另一个问题:Where are the headers of the C++ standard library

              您可以使用 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 等效的命令。

              【讨论】:

                猜你喜欢
                • 2022-01-24
                • 2012-12-14
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2023-03-10
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多