C 語言程式設計教學:在 Windows 下寫 C 程式

PUBLISHED ON MAY 22, 2018 — PROGRAMMING
FacebookTwitter LinkedIn LINE Skype EverNote GMail Email Email

    如果要在 Windows 下寫 C 程式,通常會得到三種答案:

    • 裝 Visual Studio
    • 裝 Cygwin
    • 裝 MinGW

    這三種情形各有利弊,我們會在本文中說明。

    對於初學者來說,裝 Visual Studio 無疑是最快的。裝好 Visual Studio 後,立即得到完整的 IDE 和編譯器,不用太煩心其他的工具,馬上就可以開始撰寫 C 程式碼,也不太需要懂命令列環境。早期的 Visual Studio Express 雖然免費,但限制較多,那時候在大專院校裡就流行用 Dev-C++ 來取代 Visual Studio Express;現在的 Visual Studio Community 功能夠完整了,再加上 Dev-C++ 長年未更新,一時間內其實沒有更好的選擇。

    但 Visual Studio 本身並不是沒有問題,像是 Visual C++ 內附的編譯器對 C 標準支援相對落後且短期內可能不會改善;而且 Visual C++ 允許 void main() 等非標準的寫法,某種程度也有誤導新手的嫌疑。Visual Studio 預設使用 MSBuild 等特製的專案管理工具,也會讓學習者以為一定要在這個 IDE 中才能寫程式,但專案其實可用 make(1) 或 CMake 來管理,和 IDE 脫勾。不過,對大專院校學生來說,如果只用到 ANSI C 的語法和標準函式庫,這些細節其實無關緊要。

    Cygwin 在 Windows 中加入一個微型的 POSIX 子系統,類 Unix 系統上的 shell 和許多命令列工具都可在這裡使用,也支援許多 C API (未詳細統計)。基本上,會推薦 Cygwin 的人大概都是類 Unix 系統 (如 GNU/Linux 或 BSD 系統) 玩很久,但需要在 Windows 下工作所做的妥協;對於初學者來說,這個子系統要多花一些時間適應後才會順手。筆者先前寫過一系列相關的文章,需要的讀者可看這裡

    Cygwin 的問題在於其產生的程式會額外相依於一個 Cygwin 特有的動態函式庫,如果沒用到 POSIX 的特性,其實這是多餘的。有熱心的開發者開發了 MinGW 和 MSYS,前者是編譯器,後者是微型的 POSIX 環境;這套軟體去除了原先 Cygwin 的額外相依性,可用來撰寫原生的 Windows 程式。但原本的 MinGW + MSYS 的組合過於陽春,後來又出現 MSYS2 專案,在原本的基礎上加入了套件管理的功能,算是補強了 MSYS 的弱點。

    微軟在 Windows 10 中加入 Bash on Windows,基本上,可以把這套軟體視為微軟版的 Cygwin,另一個 Windows 下的子系統。如同 Cygwin,Bash on Windows 補強原先 Windows 所缺乏的 POSIX 特性,透過這套軟體可在 Windows 內安裝一些原先在 Windows 內難以安裝的開發工具,像是一些高階語言的延伸模組和一些命令列工具。如果要寫原生的 Windows 程式,還是比較推薦先前提及的 MSYS2。

    綜合以上的想法,筆者建議以下的組合 (擇一即可):

    • MSYS2 搭配 Code::Blocks
    • MSYS2 搭配 Visual Studio Code

    Code::Blocks 的好處在於本身為跨平台軟體,可在 Windows、GNU/Linux、Mac 下執行;此外,Code::Blocks 可選用內建的專案管理程式或 Makefile,對初學者來說,可先用內建的專案管理系統減輕學習的負擔,上手後再慢慢轉到 Makefile。如果要用 Visual Studio Code,建議學一些基本的 Makefile 撰寫方式,簡化編譯軟體的過程。

    接下來,我們用經典的 Hello World 範例來說明如何在 Windows 下撰寫 C 語言。使用 IDE 的讀者,請建立一個終端機程式的專案,使用編輯器的讀者,可建立 hello.c 檔案 (也可用其他名稱,建議用英文來命名)。我們這裡以 Code::Blocks 為例,來展示建立專案過程。

    如果 Code::Blocks 無法抓到 GCC (MinGW) 的路徑,需手動修改 GCC 路徑 (從 Settings 的 Compiler 選單選擇):

    Code::Blocks 設定編譯器路徑

    選擇專案類型,這裡選「Console application」:

    Code::Blocks 選擇專案類型

    這裡會出現一個額外的提示畫面,僅僅是歡迎訊息,直接選 Next 即可:

    Code::Blocks 歡迎訊息

    選擇專案語言,記得要選 C,不要選 C++,因為 C++ 並不是 C 的超集合 (superset):

    Code::Blocks 選擇專案諨言

    設置專案名稱和路徑:

    Code::Blocks 設置專案名稱和路徑

    選擇編譯器,這裡選 GCC 即可:

    Code::Blocks 選擇編譯器

    進入 Code::Blocks 的編輯器,開始撰寫程式:

    Code::Blocks 編輯器主畫面

    我們這裡展示 Hello World 程式,暫時不要管程式碼的意義,這裡的重點是確保程式可順利運行:

    #include <stdio.h>
    
    int main()
    {
        printf("Hello World\n");
        
        return 0;
    }
    

    如果使用 IDE 的讀者,選取執行 (Run) 或等效的指令即可執行。如果使用編輯器的讀者,可參考以下終端機指令:

    C:\> gcc -o hello hello.c
    C:\> hello
    Hello World
    

    對於初期的練習,使用上述方法應該足夠。但若讀者在終端機環境中編譯 C 程式碼,久了應該會覺得反覆打指令很費時;我們將在後文介紹 make(1),這是一個知名的軟體編譯系統,可以減輕我們的工作量。