gcc和vc編譯器在語法上的比較

2021-09-30 06:26:00 字數 1999 閱讀 2881

**:

1 宣告64位資料型別:

gcc:  long long

vc: __int64

2 switch語法中的case語句:

gcc: case '0' ... '9'

vc: case 0:

case1:

...3 暫存器變數的作用範圍:

gcc:  可以把register變數宣告為全域性或區域性的

vc: 只能是區域性變數

4 有符號和無符號整形:

gcc:  在常量數字後面加ll或ull,例如:

無符號:0xffffffffffffffffull

有符號:0xffffffffffffffffll

vc: 在常量數字前加強制轉換。例如:

無符號:(uint64_t)0xffffffffffffffff

5 巨集變參

gcc: #define aaa(x...) 

vc: 不支援,在實際中碰到此類問題時只能根據**分析實際情況將它分解成若干個巨集

6 對陣列中指定元素的初始化:

gcc: static int array[100] =

功能:通過這種方法,可在陣列的宣告當中就初始化指定元素的值,除了arrar[10]和array[20]外,其餘元素會自動初始化為預設值,這給我們帶來了一種很簡捷的辦法,這功能是不是很酷?

vc: 不支援,只能通過在指定元素前後填充0或另外寫乙個初始化函式來實現。如初始化函式可以這樣寫:

void init_array()

7 結構體的對齊:

先解釋一下如下幾個屬性關鍵字的含義:

1    屬性 packed: 用於變數和型別,表示變數或結構域時使用最小可能的對齊,用於列舉、結構或聯合型別時表示該型別使用最小的記憶體。

2    屬性 aligned:用於變數、結構或聯合型別,指定變數、結構域、結構或聯合的對齊量,以位元組為單位。                     

3   屬性 noreturn:用於函式,表示該函式從不返回。這可以讓編譯器生成稍微優化的**,最重要的是可以消除不必要的警告資訊比如未初使化的變數。

4   屬性 unused:用於函式和變數,表示該函式或變數可能不使用,這個屬性可以避免編譯器產生警告資訊。

如上這些關鍵字在gcc和vc中都是相對應的,只是使用的方法不一樣。注意:vc必須裝了service pack補丁後才支援。  

gcc:

struct __attribute__((packed)) st_syment

vc:#pragma pack(push,1)

struct st_syment

#pragma pack(pop)

表示在這個結構體的元素是按位元組對齊的。

gcc: __attribute__((aligned(16)))

vc: __declspec(align(16))

表示建立此結構體例項時按16位元組對齊。

gcc: __attribute((noreturn))

vc: __declspec(noreturn)

表示此函式不需要返回。

push edx

call _func /* 呼叫名為func函式 */

pop edx

而在func()函式中又有這樣一條語句:

void func()

gcc: retaddr = __builtin_return_address(0)

vc:  __asm

__asm

我們知道,cpu執行一條指令時,eip總是指向下一條指令位址的,在呼叫乙個函式前,就會先把eip入棧,以便函式返回後繼續執行後面的指令,也就是說,在進入函式之前,棧頂(esp)的值就是eip了,所以我們就可以根據這個思路來解決。在vc編譯後生成的彙編**中,每個函式頭部都有這樣兩條指令:

push ebp

mov ebp, esp

就是將原來的esp放到ebp中了,加上前面一句push ebp,而壓棧的順序又是由高到低的,所以[ebp+4]就等於函式被調之前的eip。

VC編譯器與GCC編譯器的區別

今天無意寫了一段 發現了vc編譯器與gun的gcc編譯器還是存在區別的。畢竟gcc支援的是標準c。include struct node int main 上述 在gcc下是編譯失敗的,提示的錯誤 uknown typename node 但是放到vc編譯器下則順利編譯通過。於是按照標準c寫了另外乙...

VC編譯器命令列語法

vc編譯器 cl cl.exe 的命令列語法如下 cl option.file.option file lib.command file link link opt.引數說明 entry 含義 選項乙個或多個 cl 選項。請注意,所有選項都應用於所有指定的原始檔。選項是由乙個正斜槓 或乙個短劃線 指...

Linux下gcc編譯器和g 編譯器的那些事兒

使用c c 程式設計大約有三四個年頭了。最開始涉及到微控制器 嵌入式linux等,都使用的是c語言,那時主要寫linux驅動,甚至在arm板上寫linux應用程式時需要應用物件導向的思想的時候,都是使用c語言的結構體和函式指標來實現。當然,使用的編譯器自然就是gcc了。後來,慢慢的轉向了使用c 編寫...