gcc和g++的差異
最早以前只有GCC(GNU C Compiler),后來隨著語言的發(fā)展妆绞,GCC包含了越來越多的語言(后來開發(fā)語言也變?yōu)榱薈++)。
現(xiàn)在gcc和g++的最主要區(qū)別是在于鏈接的時候選擇的庫不相同陨收,gcc鏈接c語言庫势告,g++鏈接c++語言庫,但是編譯的時候兩者都是可以的原叮。
舉例說:
- gcc將*.c/*.cpp各自當(dāng)做c語言和c++語言編譯(只是鏈接的時候又要去調(diào)用g++)赫编。
- g++將*.c/*.cpp都當(dāng)做c++語言編譯巡蘸。
平時用的時候,只要.c文件用gcc擂送,.cpp文件用g++就好了悦荒。
此外,GCC是非常通用的編譯器嘹吨,基本支持所有標(biāo)準(zhǔn)搬味。
舉例說:
- C99, C11是C語言的現(xiàn)在標(biāo)準(zhǔn),然而在VC中依然無法完全支持C99和C11蟀拷,采用的是C89(ANSI C)標(biāo)準(zhǔn)身腻。例如,變量只能在開頭定義匹厘。
- C++11,C++14也同樣如此嘀趟。
C和C++的一些區(qū)別
以下內(nèi)容來自維基:
C++有時被認(rèn)為是C的超集,但這并不嚴(yán)謹(jǐn)愈诚。
各個版本的ISO/IEC 14882的附錄C中都指出了C++和ISO C的一些不兼容之處她按。
大部分的C代碼可以很輕易的在C++中正確編譯,但仍有少數(shù)差異炕柔,導(dǎo)致某些有效的C代碼在C++中失效酌泰,或者在C++中有不同的行為。
最常見的差異之一是匕累,C允許從void*隱式轉(zhuǎn)換到其它的指針類型陵刹,但C++不允許。下列是有效的C代碼:
/* 從 void * 隱式轉(zhuǎn)換為 int * */
int * i = malloc(sizeof(int) * 5);
但要使其在C和C++兩者皆能運作欢嘿,就需要使用顯式轉(zhuǎn)換:
int * i = (int *)malloc(sizeof(int) * 5);
另一個常見的可移植問題是衰琐,C++定義了很多的新關(guān)鍵字,如new和class炼蹦,它們在C程序中羡宙,是可以作為識別字(例:變數(shù)名)的。
C99去除了一些不兼容之處掐隐,也支持了一些C++的特性狗热,如//
注解,以及在代碼中混合聲明虑省。不過C99也納入幾個和C++沖突的新特性(如:可變長度數(shù)組匿刮、原生復(fù)數(shù)類型和復(fù)合逐字常數(shù)),而C++11已經(jīng)加入了兼容C99預(yù)處理器的特性探颈。
由于C++函數(shù)和C函數(shù)通常具有不同的名字修飾和調(diào)用約定熟丸,所有在C++中調(diào)用的C函數(shù),須放在extern "C" { /* C函數(shù)聲明 */ }之內(nèi)膝擂。
對上述的話虑啤,我做了一番測試隙弛,我的GCC版本為4.8.4。
- void* 和int *的隱式變換確實依舊問題存在狞山,c無法在c++下正確運行全闷。
- 但是可變長度數(shù)組在C下可以編譯運行,同時萍启,也能在c++下編譯運行总珠,不沖突。
#include <iostream>
#include <stdlib.h>
using namespace std;
int main()
{
int n = 10;
int a[n];
int * i = malloc(sizeof(int) * 5);
cout <<sizeof(a)/sizeof(a[0]) << endl;
n = 20;
cout <<sizeof(a)/sizeof(a[0]) << endl;
return 0;
}
上述代碼沒有可變數(shù)組的問題勘纯,只有隱式變換的問題局服,可能是因為C++的現(xiàn)有標(biāo)準(zhǔn)也早已經(jīng)兼容了C99。上述代碼還涉及一個可變數(shù)組的問題驳遵,就是兩次輸出都是10淫奔,a一旦定義后,其長度是不變的了堤结,不管n是否變化唆迁。
這樣的話,總的來說竞穷,C的代碼放在C++下基本沒啥問題了唐责。作為一個喜歡用C++寫C的人來說,就無需擔(dān)心啥瘾带。鼠哥。
可變數(shù)組和可變字符串的問題
其實最初寫這篇筆記也是因為這兩個問題,總結(jié)過老是忘記看政,還是寫下來為妙朴恳。
- 可變長度字符串
其實這個很簡單,可以有好多實現(xiàn)方式帽衙。
- 指針定義字符串
char *p = "Hello World";
這里得注意菜皂,p可以重新指向一個新的字符串常量,但是無法通過*p修改字符串常量的內(nèi)容厉萝。
- string類(我偏向于使用這個)
- 字符數(shù)組
#define N 10000
char str[N]={};
我們可以定義一個很大的字符數(shù)組,但是因為有‘\0’的存在榨崩,strlen()可以是變化的谴垫。注意,sizeof()的話還是N的長度母蛛。
- 可變長度數(shù)組
數(shù)組沒辦法翩剪,一開始一定要指定長度疼燥,在C89那會纪隙,必須要用常量才能賦予長度,但是后來在C99后變量也可以賦予長度了,此外const常變量也可以賦予長度唱歧。
方法很多,動態(tài)數(shù)組還可以用new(C++)或malloc(C)實現(xiàn)蔼卡。
int n=20;
int *p=new int[n];
這些所謂的動態(tài)其實一旦賦值之后數(shù)組長度就不變了嵌施,要換長度就得delete,再重新new浙巫。