c和c 的區別 gcc和g 的區別

2021-08-10 15:44:49 字數 2015 閱讀 5230

c89沒有帶有預設值的函式(c99有)

c++99有帶有預設值的函式(從右向左給預設值)函式宣告處也可以 給預設值。

c語言沒有內聯函式。

內聯函式:在函式的呼叫點,把函式的**全部展開,編譯過程所做的工作。而巨集是在預編譯展開的(預編譯階段不進行檢查,純粹的字串替換),所以可以把內聯函式稱作更安全的巨集(編譯階段進行型別檢查)。inline只在release版本起作用。debug版本裡面,illine函式的呼叫也需要棧幀的開闢和回退。

考察方向

內聯函式與普通函式的區別?

內聯函式沒有標準的函式棧幀的開闢和回退。

普通函式有。

內聯函式與static函式的區別是什麼?

static函式產生符號(產生的符號是local,只本.cpp可見),內聯函式不會產生符號。
c語言沒有函式的過載。c++有函式的過載。(在c語言中,函式產生符號是由函式名稱決定的,而在c++中,函式產生符號是由函式名稱+形參的型別+形參的個數。所以可以構成函式的過載。)

c++**如何呼叫c**?用extern 「c」{} 在函式宣告的時候加上。c如何呼叫c++不可見源**? 用extern 「c」{} 把封裝的介面變成c語言的介面

c語言的const不是必須初始化的(c語言中,用const修飾的量叫常變數,不是常量) const修飾的常變數和普通的變數唯一的區別就是,常變數定義以後,不能作為左值。

c++的const修飾的量必須初始化,(常量)const的編譯規則:c++中,所有使用常量名字的地方全部替換成常量的初始值。

c語言中沒有引用。c++中有引用。

引用必須初始化、初始化的值必須要能取位址、引用不能改變,沒有二級引用、訪問引用變數,永遠訪問的是它所引用的記憶體。

c語言開闢記憶體和釋放 malloc free

c++是 new delete

c語言的作用域 :區域性作用域、全域性作用域。

c++的作用域 : 區域性作用域、類作用域、名字空間作用域namespace->全域性的名字空間作用域和區域性的名字空間作用域。

gcc/g++在執行編譯工作的時候,總共需要4步

預處理,生成.i檔案

將預處理後的檔案轉換成組合語言,生成檔案.s

由彙編變成目標**(機器**)生成.o的檔案

連線目標**,生成可執行程式。

字尾為.c的,gcc把它當作是c程式,而g++當作是c++程式;字尾為.cpp的,兩者都會認為是c++程式,注意,雖然c++是c的超集,但是兩者對語法的要求是由區別的,例如如下**:

#include

int main()

intsum(int a,int b)

如果按照c的語法規則編譯,不會報錯。(有警告)

如果按照c++的語法規則編譯,就會出現錯誤。

編譯階段,g++會呼叫gcc,對於c++**,兩者是等價的,但是因為gcc命令不能自動和c++使用的庫連線,所以通常用g++來完成鏈結,為了統一起見,編譯/鏈結統用g++了,這就給人一種錯覺,好像cpp程式只能用g++似的。

gcc不會定義_cplusplus巨集,而g++會? 實際上,這個巨集只是標誌這編譯器將會把**按c還是c++語言來解釋,如果字尾為.c,並且採用gcc編譯器,則該巨集是未定義的,否則,就是已定義。

gcc和g 的區別?c和c 的區別?

很明顯,gcc是用來編譯c程式的,而g 是用來編譯c 程式的。但是g 可以同時編譯c c 程式,這是因為g 在編譯c程式的時候會呼叫gcc。而gcc不可以編譯c 程式,分步測試,發現gcc在編譯c 程式的時候在編譯和鏈結這兩步報錯,而前面預編譯 彙編都可以順利通過。這是因為c和c 程式在預編譯和彙編...

gcc和g 的區別

gcc和g 都是gnu 組織 的乙個編譯器。誤區一 gcc只能編譯c g 只能編譯c 兩者都可以,但是請注意 1.字尾為.c的,gcc把它當作是c程式,而g 當作是c 程式 字尾為.cpp的,兩者都會認為是c 程式,注意,雖然c 是c的超集,但是兩者對語法的要求是有區別的。c 的語法規則更加嚴謹一些...

GCC和G 的區別

gcc和g 都是gnu 組織 的乙個編譯器。誤區一 gcc只能編譯c g 只能編譯c 兩者都可以,但是請注意 1.字尾為.c的,gcc把它當作是c程式,而g 當作是c 程式 字尾為.cpp的,兩者都會認為是c 程式,注意,雖然c 是c的超集,但是兩者對語法的要求是有區別的。c 的語法規則更加嚴謹一些...