本節書摘來自異步社群《21天學通c語言(第6版•修訂版)》一書中的第1章,第1.5節,作者 【美】bradley l. jones , peter aitken,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視
21天學通c語言(第6版•修訂版)
讀者也許迫不及待地想編寫第一個c語言程式。為幫助讀者熟悉編譯器,程式清單1.1包含一個小型程式,功能快速地完成。現在,讀者也許無法了解其中的所有内容,但不用擔心,盡管編寫、編譯并運作它。
這裡的示範使用的是一個名為hello.c的程式,該程式隻是将單詞“hello, world!”顯示到螢幕上而已。該程式常被用來介紹c語言程式設計,很适合讀者進行學習。程式清單1.1列出了hello.c的源代碼。輸入該程式清單時,請不要輸入最左邊的行号和冒号。
程式清單1.1 hello.c
請務必按軟體提供的安裝說明安裝編譯器。無論您使用的是linux、dos、unix、windows還是其他作業系統,請務必了解如何使用您所選擇的編輯器和編譯器。準備好編譯器和編輯器後,請按下面的步驟輸入、編譯并執行hello.c。
要輸入并編譯hello.c,請按下面的步驟進行:
1.在要存儲c語言程式的目錄中啟動編輯器。正如前面指出的,可以使用任何文本編輯器,但內建開發環境(ide)自帶的大多數編譯器(如borland的turbo c++和microsoft 的visual c++)都能讓您以一種友善的設定來輸入、編譯和連結程式。請檢視使用者手冊,了解編譯器是否有ide。
2.通過鍵盤輸入hello.c中的源代碼,内容應同程式清單1.1完全相同。換行時,請按enter鍵。

請不要輸入行号和冒号,它們是為了便于引用而提供的。
3.儲存源代碼,将其命名為hello.c。
4.通過列出目錄中的檔案清單,驗證hello.c是否已被儲存到磁盤中。檔案清單中應包含檔案hello.c。
5.編譯并連結hello.c。執行編譯器使用者手冊指定的指令,您将看到一條消息,指出沒有任何錯誤和警告。
6.檢視編譯器消息。如果沒有任何錯誤和警告,則說明一切正常。
如果輸入的程式不正确,編譯器将捕獲您犯的錯誤,并顯示錯誤消息。例如,如果将printf輸入為prntf,您将看到一條與下面類似的消息:
7.如果出現錯誤消息,請傳回到第2步。在編輯器中打開hello.c,将該檔案内容同程式清單1.1進行仔細比較、修正,然後進入到第3步。
8.至此,您的第一個c語言程式應編譯好,可以執行了。此時如果顯示所有名為hello的檔案,将看到以下檔案:
hello.c:使用編輯器建立的源代碼檔案;
hello.obj或hello.o:其中包含hello.c的目标代碼;
hello.exe:編譯并連結hello.c時建立的可執行程式。
9.要執行hello.exe,隻須執行hello指令即可,消息“hello, world!”将顯示在螢幕上。
祝賀您!您已經輸入、編譯并運作了您的第一個c語言程式。應該承認,hello.c是一個很簡單的程式,并不能完成任何有用的工作,但它開了一個頭。事實上,當今大部分專家級c語言程式員都是以同樣的方式——編譯hello.c——開始學習的。
如果您使用的是附錄g介紹的bloodshed dev-c++編譯器,請閱讀附錄g,其中介紹了如何安裝該編譯器以及如何使用它來建立程式。該編譯器可用于windows 95或更高的版本中。
1.編譯錯誤
當編譯器發現源代碼中的某些内容無法編譯時,将發生編譯錯誤。拼寫錯誤、印刷錯誤等都可能導緻編譯器停止工作。好在現代的大多數編譯器不僅僅是停止工作,還會告訴您問題出在哪裡!這使得查找和修改源代碼中的錯誤更容易。
可以有意在前面輸入的hello.c程式中加入錯誤來說明這一點。如果您完成了前面的範例,磁盤上将有hello.c的一個拷貝。在編輯器中打開該檔案,然後将光标移到printf( )所在行的末尾,并删除最後的分号。此時,hello.c的内容如程式清單1.2所示。
程式清單1.2 hello2.c:有錯誤的hello.c
然後儲存該檔案。現在可以編譯它了,方法是執行編譯器指令。由于剛才引入的錯誤,編譯将無法完成。編譯器将顯示與下面類似的錯誤:
上述消息包含三部分:
hello.c:有錯誤的檔案的名稱:
(6):錯誤所在行的編号;
error: ‘;’ expected:對錯誤的描述。
上述消息包含大量的資訊,它指出:編譯器發現hello.c第6行應該有一個分号,但沒有。然而您知道,實際上是第5行遺漏了一個分号,這與消息所指出的不符。為何編譯器報告第6行有錯誤,而實際上是第5行遺漏了分号呢?問題的答案在于,c編譯器并不關心行之間的換行符,printf( )語句之後的分号也可以放在下一行的開頭(雖然這樣做容易引起混淆,不是一個好的程式設計習慣)。編譯器遇到第6行的下一個指令後,才能确定遺漏了一個分号。是以,編譯器指出第6行有錯。
這指出了有關c語言編譯器和錯誤消息的一個不可否認的事實。雖然編譯器在檢測和定位錯誤方面很聰明,但它并非愛因斯坦。您必須使用有關c語言的知識,對編譯器的消息進行解讀,以确定報告的錯誤的實際位置。通常,能夠在編譯器指出的行中找到錯誤,但如果找不到,則幾乎總是在前一行。剛開始時,查找錯誤可能有些困難,但您很快便能得心應手。
報告的錯誤可能随編譯器而異。在大多數情況下,通過錯誤消息,您應該能夠知道發生了什麼錯誤或錯誤的位置。
結束有關這個主題的讨論之前,請看另一個編譯錯誤的例子。再次将hello.c裝載到編輯器中,并做以下修改:
1.在第5行的末尾加上分号;
2.删除單詞hello前面的雙引号。
儲存檔案,并再次編譯該程式。這次,編譯器将顯示類似于下面的錯誤消息:
第一條錯誤消息正确地指出了錯誤——第5行的hello。錯誤消息undifined identifier意味着編譯器無法識别hello,因為它沒有用引号括起。然而,其他4條錯誤消息呢?這些錯誤消息(現在無須關心它們的含義)表明,c語言程式中的一個錯誤有時候可能導緻多條錯誤消息。
我們從中得到的教訓是:如果編譯器報告了多個錯誤,而您隻找到一個,請修複該錯誤并重新編譯。您可能發現,隻須修改一個地方,程式便沒有任何錯誤,并能通過編譯。
2.連結程式的錯誤消息
連結程式錯誤比較少,通常是由于錯誤拼寫c語言庫函數的名稱引起的。在這種情況下,将顯示錯誤消息error: undefined symbols:,後面為拼錯的名稱(名稱前有一個下劃線)。更正拼寫後,問題将得到解決。