三大區別
- GNU是一個軟件項目名。它開發了許多應用程序。
- GCC全稱 GNU C Compiler, 最早的時候就是一個c編譯器。
- 後來這個項目裏邊集成了更多其他不同語言的編譯器,
- GCC就代表 the GNU Compiler Collection,一堆編譯器合集。
- G++則是GCC的c++編譯器
有一篇
- GCC:GNU Compiler Collection,它可編譯C、C++、JAV、Fortran、Pascal、Object-C、Ada
- gcc是GCC中的GUN C Compiler(C 編譯器)
- g++是GCC中的GUN C++ Compiler(C++編譯器)
-
gcc和g++並不是編譯器,也不是編譯器的集合,只是一種驅動器,
-
根據參數中要編譯的文件的類型,調用對應的GUN編譯器
-
gcc編譯一個c文件的話,以下幾步:
-
Step1:Call a preprocessor, like cpp.
-
Step2:Call an actual compiler, like cc or cc1.
-
Step3:Call an assembler, like as.
-
Step4:Call a linker, like ld
-
編譯器是可更換的,所以gcc不僅僅可以編譯C文件
-
更準確:gcc調用了C compiler,g++調用了C++ compiler
gcc和g++的主要區別
- 對 .c和.cpp,gcc分別當做c和cpp文件編譯(c和cpp語法強度是不一樣)
- 對 .c和.cpp,g++統一當做cpp編譯
- g++編譯文件時,g++會自動鏈接標準庫STL,gcc不會自動鏈接STL
- gcc在編譯C文件時,可用的預定義宏少
- gcc在編譯cpp文件時/g++在編譯c文件和cpp文件時(這時候gcc和g++調用的都是cpp文件的編譯器),會加入一些額外宏
#define __GXX_WEAK__ 1
#define __cplusplus 1
#define __DEPRECATED 1
#define __GNUG__ 4
#define __EXCEPTIONS 1
#define __private_extern__ extern 6
- 用gcc編譯c++時,爲能用STL,需加參數–lstdc++ ,這並不代表 gcc –lstdc++ 和 g++等價
- gcc可以用來編譯c++但它不會自動調用鏈接的c++庫,需手動鏈接,
- gcc -lstdc++ main.cpp。g++則會自動調用鏈接的c++庫。
- g++在編譯的過程中,其實是調用gcc按照c++程序來編譯的。即編譯工作最終都是由gcc來完成的。
- 對於c++程序,gcc不能自動和C++程序使用的庫聯接,需要自己手動鏈接c++庫,所以鏈接可以用g++或者gcc -lstdc++。也即是說c++程序,也可以用gcc來鏈接。
- 但gcc在編譯c程序的時候,它會自動鏈接c庫的。
- 誤區:gcc只能編譯c代碼,g++只能編譯c++代碼
- .c的,gcc把它當作是C程序,而g++當作是c++程序
- .cpp的,兩者都會認爲是c++程序,注意,雖然c++是c的超集,但是兩者對語法的要求是有區別的。C++的語法規則更加嚴謹一些。
- 編譯階段,g++會調用gcc。對c++,可以用gcc或g++來編譯,二者等價的。
- 鏈接階段,因爲gcc命令不能自動和C++程序使用的庫聯接,所以通常用g++來完成鏈接。一般爲了方便,乾脆編譯和鏈接都用g++了。這就給人一種錯覺,好像cpp程序只能用g++編譯鏈接似的。
- 誤區:gcc不會定義__cplusplus宏,而g++會
- 這個宏只是標誌着編譯器將會把代碼按C還是C++語法來解釋,如上所述,如果後綴爲.c,並且採用gcc編譯器,則該宏就是未定義的,否則,就是已定義。
- 誤區:編譯只能用gcc,鏈接只能用g++
- 應該這樣說:編譯可以用gcc/g++,而鏈接可以用g++或者gcc -lstdc++。gcc不能自動和C++程序使用的庫聯接,所以通常使用g++來完成聯接。但在編譯階段,g++會自動調用gcc,二者等價。
chao網址
- https://blog.csdn.net/p942005405/article/details/83061693
STL
- “Standard Template Library”
- STL 是 C++ 標準庫的一部分,不用單獨安裝。
- C++ 對模板(Template)支持得很好,STL 就是藉助模板把常用的數據結構及其算法都實現了一遍,做到了數據結構和算法的分離。
- vector 的底層爲順序表(數組),
- list 的底層爲雙向鏈表,
- deque 的底層爲循環隊列,
- set 的底層爲紅黑樹,
- hash_set 的底層爲哈希表。
鏈接
- http://c.biancheng.net/stl/