现在的位置: 首页 > 综合 > 正文

从GCC编译器来学习各类C标准及编译器使用

2018年03月30日 ⁄ 综合 ⁄ 共 3152字 ⁄ 字号 评论关闭

GCC简介:

GCCGNUCompilerCollectionGNU編譯器套裝),是一套由GNU開發的編程語言編譯器它是一套以GPLLGPL授權條款所發行的自由軟體,也是GNU計畫的關鍵部分,亦是自由的Unix及蘋果電腦MacOS
X
 操作系統的標準編譯器。GCC(特別是其中的C語言編譯器)也常被認為是跨平台編譯器的事實標準。

GCC原名為GNUC語言編譯器GNUCCompiler),因為它原本只能處理C語言GCC很快地擴展,變得可處理C++。之後也變得可處理FortranPascalObjective-CJavaAda,以及Go與其他語言。

以上介绍参考自维基百科:http://zh.wikipedia.org/wiki/GCC

官网可查看并下载最新的版本:https://gcc.gnu.org/

笔者获取最新源码和版本的方式通过官网介绍的git
read access
(通过GIT),但实际使用的版本的是 gcc4.8.2(ubuntu14.04LTS操作系统)


疑问一:GCC采用什么标准呢?针对C语言,比如像gcc helloworld.c这句命令,采用的是什么标准?

    可以从features.h头文件内部获得详细的信息,里面定义了各种标准的宏定义,GCC编译器通过相关的宏定义采用不同的标准进行编译。该文在linux(ubuntu)下文件路径为:/usr/include/

    gcc若没有使用-std参数来指定GCCC标准,则使用默认的GNUC90标准(C90with
GNU extensions)(GCC
C99C11支持得不完整),GNUC90标准在C90标准的基础上进行了扩展.这个标准一般在linux下使用(__GNUC__,__GNUC_MINOR__)

    关于更多的扩展内容可查看:http://blog.csdn.net/wang6077160/article/details/6660316linux内核使用的GNUC
&
标准C的差异),或从官网获得这方面的内容详细介绍。关于这些扩展内容一个典型的应用是无副作用的max,min宏定义(利用了GNU的拓展特性)


疑问二:关于C语言有哪些标准?

常见标准(K&RC ANSI C ISO C):

以下两段话参考自维基百http://zh.wikipedia.org/wiki/ANSI_C

ANSIC美國國家標準協會ANSI)對C語言發布的標準。使用C的軟體開發者被鼓勵遵循ANSIC文檔的要求,因為它鼓勵使用跨平台的代碼。

C的第一個標準是由ANSI發布的。雖然這份文檔後來被國際標準化組織ISO)採納並且ISO發布的修訂版也被ANSI採納了,但名稱ANSIC(而不是ISOC)仍被廣泛使用。一些軟體開發者使用ISOC,還有一些使用StandardC

上述说明ISO
C
Standard CANSI
C
是指同一个标准,并没有区别。

K&RC 是早期C语言标准,《C专家编程》作者PeterVan
Der Linden
建议使用ANSIC标准进行学习,《C和指针》《C陷阱与缺陷》描述的也是ANSIC标准。因此,学习C语言,如果需要保证可移植性,应使用ANSIC标准。根据实际使用,可采用C90标准或C99C11更新的标准。

ANSIC标准各个阶段(C89,C90,C99,C11)区别可参考维基百科:http://zh.wikipedia.org/wiki/C語言主要用于确定语法采用的标准是C90的标准还是更新的标准。

GCC编译器里涉及的其他标准介绍(参考自http://linux.sheup.com/linux/linux6927.htm:

POSIX:
POSIXPortableOperating System Interface for Computer Environments的縮寫,它是ISOC的延伸,明定了一個可移植的作業系統所應具備種種條件,其範圍不只有系統函式庫而已,還同時包括一些標準的工具程式、系統核心應有的特色與實作、以及在C函式庫中某些與作業系統相關的低階控制支援(如系統呼叫窗口)等等。由於glibc是完全按照POSIX的標準來實作的,同時搭配了符合POSIX標準的linux核心,故在此環境下開發的程式可以做到完全符合POSIX的規格。
BerkeleyUnix:
BerkeleyUnix 泛稱柏克萊大學所開發的UNIX系列作業系統,包括4.2BSD4.3BSD4.4BSD以及早期的SunOS。這些系統的C函式庫中有許多傑出的設計,但卻沒有在上述兩個標準中,包括select()函式、sockets....等等,這些在glibc中都有支援。
SVID:
SVIDSystemV Interface Description的縮寫,它是一份描述AT&TUNIX
System V
系統規格的文件,它是POSIX標準的延伸。Glibc實作了大部分的SVID規格要求,其中較重要的包括了行程之間的通訊標準以及分享式記憶體(sharedmemory),至於其他的部分則較不常使用。實作SVID主要的目的是希望可以做到與UNIXSystem
V
的相容與程式的可移植性。
XPG:
XPGX/OpenPortability Guide的縮寫,是由X/OpenCompany,
Ltd.
所發表,同時X/Open還擁有UNIX商標的版權。而這份規格不但是POSIX標準的擴充,同時也明定了一個UNIX作業系統所應符合的要求。其中包括了iconv()字集轉換介面,以及部分BSDSVID的特色。
除了上述的規格外,glibc還內含了GNU特有的特色,稱之為GNUExtension。這些特色在某些情況下可以方便程式的撰寫與維護,但就不見得可以移植到其他UNIX平台上,故在可移植性的考量下使用時必須留意。

疑问三:GCC下如何使用ANSI
C
标准?


熟知的C标准大概有三种:c90(
or c89), c99, c11.
分别于1990,1999,2011年发布.

gcc在编译的时候指定c90标准:-ansi,
-std=c90 or -std=iso9899:1990;

gcc指定C99标准:-std=c99
or -std=iso9899:1999

gcc指定C11标准:-std=c11
or -std=iso9899:2011


如下表,GCC至今已支持4C标准。注意有些标准是不完全支持的。

另外,GCC也提供了扩展的C标准(GNUC)。


 
  对于目
前来说
,遵循最早的
ANSIC标准最好使用-ansi
(再加-pedantic选项,确保编译器使用该标准)。如果需要使用更新的标准,可以使用GNUC,但是要注意区分GNU的扩展内容和新的标准内容。


疑问四:windowVS编译器使用什么标准?


MicrosoftVisual C++(簡稱VisualC++MSVCVC++VC)是微軟公司C++開發工具

对于C来说只支持到C89,所以很多后来的特性在VS下不能使用,会编译出错(非C++),如inline关键字在C99标准中加入的,C89标准并没有。

疑问五:C标准和C++标准区别和联系是什么?

C++标准应该是从C标准C90拓展及改进过来的,因为最早的C++标准是C++98,第一版C++标准。

第一版:C++98 ISO/IEC14882:1998

第二版:C++03 ISO/IEC 14882:2003

第三版:C++11先前被稱作C++0x ISO/IEC14882:2011

第四版:C++14 ISO/IEC14882:2014(E) 

C++PRIMER PLUS》(第五版)采用的是C++03标准编写的。

关于编译器对各个标准的支持程度,可以查看编译器的官方文档。




抱歉!评论已关闭.