C和C++的一些筆記

gcc和g++的差異

最早以前只有GCC(GNU C Compiler),后來隨著語言的發展,GCC包含了越來越多的語言(后來開發語言也變為了C++)。

現在gcc和g++的最主要區別是在于鏈接的時候選擇的庫不相同,gcc鏈接c語言庫,g++鏈接c++語言庫,但是編譯的時候兩者都是可以的。

舉例說:

  1. gcc將*.c/*.cpp各自當做c語言和c++語言編譯(只是鏈接的時候又要去調用g++)。
  2. g++將*.c/*.cpp都當做c++語言編譯。

平時用的時候,只要.c文件用gcc,.cpp文件用g++就好了。

此外,GCC是非常通用的編譯器,基本支持所有標準。

舉例說:

  1. C99, C11是C語言的現在標準,然而在VC中依然無法完全支持C99和C11,采用的是C89(ANSI C)標準。例如,變量只能在開頭定義。
  2. C++11,C++14也同樣如此。

C和C++的一些區別

以下內容來自維基:

C++有時被認為是C的超集,但這并不嚴謹。
各個版本的ISO/IEC 14882的附錄C中都指出了C++和ISO C的一些不兼容之處。
大部分的C代碼可以很輕易的在C++中正確編譯,但仍有少數差異,導致某些有效的C代碼在C++中失效,或者在C++中有不同的行為。
最常見的差異之一是,C允許從void*隱式轉換到其它的指針類型,但C++不允許。下列是有效的C代碼:

/* 從 void * 隱式轉換為 int * */
int * i = malloc(sizeof(int) * 5);

但要使其在C和C++兩者皆能運作,就需要使用顯式轉換:

int * i = (int *)malloc(sizeof(int) * 5);

另一個常見的可移植問題是,C++定義了很多的新關鍵字,如new和class,它們在C程序中,是可以作為識別字(例:變數名)的。

C99去除了一些不兼容之處,也支持了一些C++的特性,如//
注解,以及在代碼中混合聲明。不過C99也納入幾個和C++沖突的新特性(如:可變長度數組、原生復數類型和復合逐字常數),而C++11已經加入了兼容C99預處理器的特性。

由于C++函數和C函數通常具有不同的名字修飾和調用約定,所有在C++中調用的C函數,須放在extern "C" { /* C函數聲明 */ }之內。

對上述的話,我做了一番測試,我的GCC版本為4.8.4。

  1. void* 和int *的隱式變換確實依舊問題存在,c無法在c++下正確運行。
  2. 但是可變長度數組在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;
}

上述代碼沒有可變數組的問題,只有隱式變換的問題,可能是因為C++的現有標準也早已經兼容了C99。上述代碼還涉及一個可變數組的問題,就是兩次輸出都是10,a一旦定義后,其長度是不變的了,不管n是否變化。

這樣的話,總的來說,C的代碼放在C++下基本沒啥問題了。作為一個喜歡用C++寫C的人來說,就無需擔心啥。。


可變數組和可變字符串的問題

其實最初寫這篇筆記也是因為這兩個問題,總結過老是忘記,還是寫下來為妙。

  • 可變長度字符串

其實這個很簡單,可以有好多實現方式。

  1. 指針定義字符串
char *p = "Hello World";

這里得注意,p可以重新指向一個新的字符串常量,但是無法通過*p修改字符串常量的內容。

  1. string類(我偏向于使用這個)
  2. 字符數組
#define N 10000
char str[N]={};

我們可以定義一個很大的字符數組,但是因為有‘\0’的存在,strlen()可以是變化的。注意,sizeof()的話還是N的長度。

  • 可變長度數組

數組沒辦法,一開始一定要指定長度,在C89那會,必須要用常量才能賦予長度,但是后來在C99后變量也可以賦予長度了,此外const常變量也可以賦予長度。

方法很多,動態數組還可以用new(C++)或malloc(C)實現。

 int n=20;      
 int *p=new int[n];

這些所謂的動態其實一旦賦值之后數組長度就不變了,要換長度就得delete,再重新new。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容