簡體   English   中英

在哪里下載 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);

我看不到交換的實際代碼在哪里。 在這里,它只是調用自己。

C++ 庫的實現在不同的編譯器/系統上有所不同。 如果您使用 GCC/G++ 作為編譯器,您可以從http://gcc.gnu.org/libstdc++/下載源代碼。

或者您可以使用以下命令匿名簽出源代碼

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

.h 文件包含實現。 該頁面上的許多標頭只是其他標頭的包裝器或提供 typedef,但是如果您查看stl_set.h類的文件,您將看到它具有set類的所有函數定義。

甚至頁面本身也聲明它是一個僅標頭庫,這意味着實現包含在標頭中。

STL 是一個模板庫。 我希望您只能在頭文件中找到實現。

這不是別的。 請注意,頁面上寫着:

STL 的這個發行版完全由頭文件組成:不需要鏈接到任何庫文件

實現都在頭文件中。 你必須用模板來做到這一點。 :-/

您可以在std_algobase.h找到swapstd_algobase.h

SGI STL 文件名都以“stl_”開頭。

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

下面是文件 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;
}

您無需下載文件。 您可以使用 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 找到等效的命令。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM