今天無意寫了一段**,發現了vc編譯器與gun的gcc編譯器還是存在區別的。畢竟gcc支援的是標準c。
#include struct node
;int main()
上述**在gcc下是編譯失敗的,提示的錯誤:uknown typename 'node'.但是放到vc編譯器下則順利編譯通過。
於是按照標準c寫了另外乙個版本。
#include struct node
;int main()
則通過標準c編譯,因為此處node的作用就是乙個標籤。除非使用typedef才可以作為型別直接使用。否則標籤前面還是要加上struct關鍵字。
下面是使用typedef建立的型別名,但是需要定義乙個標籤來致命結構體內部的指標。
#include typedef struct node1
node;
int main()
不過下面這種方式在gcc編譯也通過
#include typedef struct
node;
int main()
說明在結構體內部宣告指向結構體自身的指標使用標籤形式,是因為標籤沒有宣告。在標籤前面新增struct則認為此處宣告是合法的乙個指標,但是由於標籤未宣告則此指標具體指向什麼型別的結構體則是不知道的,此處是有隱患的,只是通過了語法檢測而已。
根據上述推測,我寫了另外乙個版本
#include typedef struct
node;
int main()
此版本仍然可以通過gcc編譯,說明猜測是正確的。此處涉及到了不完整宣告。可參照《c和指標》p199. gcc編譯器簡介
在linux中選擇gcc編譯器的原因是gcc執行效率高。gcc基本用法 gcc options filename 其中options為編譯選項。例子 執行指令 gcc hello.c 則對hello.c進行編譯,如果程式沒有語法錯誤,則產生可執行檔案a.out gcc預設檔名 執行可執行檔案指令 a...
gcc編譯器(二)
靜態庫 工程在呼叫靜態庫時,複製靜態庫源 加長,不節省程式空間字尾名.a 優點 編譯後不需要再依賴庫 以空間換時間 動態庫 工程建立對映關係,每次呼叫都需要去庫中載入,字尾名為.so 共享庫 程式輕便,便於公升級。小tips 所有程式執行都在記憶體中,硬碟只能儲存程式。靜態庫的建立 gcc c 原始...
GCC編譯器學習
不同的平台如x86和arm,一段程式跑起來到最下面會轉成彙編,彙編要轉成機器碼,機器碼會由於硬體平台不同而不同。有時候要程式設計序在arm上跑,必須針對arm寫程式,但是在arm上寫程式很麻煩 沒有很好的開發工具 所以我們就在x86平台上 windows 上把程式寫好,但是編譯的時候告訴它我們要執行...