天天看點

C/C++版本更疊曆程前言C語言版本更疊C++版本更疊号外号外

文章目錄

  • 前言
  • C語言版本更疊
  • C++版本更疊
  • 号外号外
    • C/C++标準
    • gcc/g++

前言

使用

C/C++

實作功能的時候經常需要上網搜尋一些解決方案,但是當你把代碼粘貼到自己項目中時偶爾會出現編譯失敗的問題,其中一個原因就是新加的代碼所使用的特性在目前的編譯環境中并不支援,就好像不久前我們還在使用VS2003寫着C++98标準的代碼(2015年),雖然對C++11的特性垂涎已久,但是無奈在項目中就是無法使用,隻能是遙望着它發飛快地發展出了C++14和C++17。

涉及到C/C++版本和标準的最常見的地方就是編譯選項了,比如常見的

-std=c++11

就是使用C++11的标準編譯,關于

C/C++

各個版本标準的差異我們可能無法全部記住,但是一些主要的版本更替,還是很有必要了解一下的。

C語言版本更疊

年份 C标準 通用名 别名 标準編譯選項 GNU擴充選項
1972 Birth C - - - -
1978 K&R C - - - -
1989-1990 X3.159-1989, ISO/IEC 9899:1990 C89 C90, ANSI C, ISO C

-ansi

,

-std=c90

,

-std=iso9899:1990

-std=gnu90

1995 ISO/IEC 9899/AMD1:1995 AMD1 C94, C95

-std=iso9899:199409

-
1999 ISO/IEC 9899:1999 C99 -

-std=c99

,

-std=iso9899:1999

-std=gnu99

2011 ISO/IEC 9899:2011 C11 -

-std=c11

,

-std=iso9899:2011

-std=gnu11

2018 ISO/IEC 9899:2018 C18 -

-std=c18

,

-std=iso9899:2018

-std=gnu18

C++版本更疊

年份 C++标準 通用名 别名 标準編譯選項 GNU擴充選項
1978 C with Classes - - - -
1998 ISO/IEC 14882:1998 C++98 -

-std=c++98

-std=gnu++98

2003 ISO/IEC 14882:2003 C++03 -

-std=c++03

-std=gnu++03

2011 ISO/IEC 14882:2011 C++11 C++0x

std=c++11

,

std=c++0x

std=gnu++11

,

std=gnu++0x

2014 ISO/IEC 14882:2014 C++14 C++1y

std=c++14

,

std=c++1y

std=gnu++14

,

std=gnu++1y

2017 ISO/IEC 14882:2017 C++17 C++1z

std=c++17

,

std=c++1z

std=gnu++17

,

std=gnu++1z

2020 to be determined C++20 C++2a

-std=c++2a

std=gnu++2a

号外号外

C/C++标準

  1. 看了

    C++

    的發展史才知道,原來從1978年Bjarne Stroustrup就開始了

    C++

    雛形的使用,直到20年後的1998年才确定了第一個

    C++

    标準

    2.

    C++11

    之前被稱為

    C++0x

    ,據說

    C++0x

    C++11

    的草案,是以有些編譯器使用

    C++11

    的編譯參數是:

    -std=c++0x

    ,後來使用:

    -std=c++11

    ,但是據說不完全相同
  2. 關于

    C++20

    ,協程的加入應該是一大驚喜了,值得期待!官方還表示,

    C++20

    應該會是一個像

    C++11

    那樣的大版本

gcc/g++

  1. gcc

    發展到今天已經不單單可以編譯

    C

    語言了,還可以編譯

    C++

    Java

    Object-C

    等多種其他語言
  2. 有一種說法是

    GCC

    的全名是GNU Compiler Collection(GUN 編譯器集合),而

    gcc

    GCC

    中用于編譯c語言的編譯器
  3. 事實上,

    gcc

    看起來并不像是一個編譯器,而像一個排程器,針對于不同的檔案調用不同程式設計語言的編譯器
  4. 對于字尾為

    *.c

    的檔案,

    gcc

    把它當作是

    C

    語言程式源代碼,而g++當作是C++程式源代碼
  5. 對于字尾為

    *.cpp

    的檔案,

    gcc

    g++

    都會當作是C++程式源代碼
  6. 使用

    g++

    編譯檔案時,g++會自動連結标準庫

    STL

    ,而

    gcc

    不會自動連結

    STL

    ,是以再使用

    gcc

    編譯

    C++

    程式是有時會報錯
  7. 在用

    gcc

    編譯

    C++

    檔案時,為了能夠使用

    STL

    ,需要加參數

    –lstdc++

    ,但這并不代表

    gcc –lstdc++

    g++

    等價
  8. 據說

    g++

    會調用

    gcc

    ,對于

    C++

    代碼,因為

    gcc

    指令不能自動和

    C++

    程式使用的庫聯接,是以通常用

    g++

    來完成連結
  9. 需要注意的是,雖說

    g++

    會調用

    gcc

    ,對于

    *.c

    檔案來說,編譯出來的可執行檔案也不一樣,因為

    gcc

    會當成

    C

    語言程式編譯,而

    g++

    調用的

    gcc

    會把它當做

    C++

    語言程式來編譯,這或許就能解釋為什麼用

    g++

    就可以編譯所有

    C/C++

    的程式,還要有

    gcc

    的存在(就我測試來看,同樣的

    C

    語言代碼,

    g++

    編譯出來的程式體積要大一些)