[入門級] 如何用 Mac OS X 的 Xcode 寫 C 語言程式

5 篇文章 0 订阅
1 篇文章 0 订阅

Acknowledgement:

http://blog.yorkxin.org/2009/03/15/fundamental-c-with-xcode


Deprecation Warning: 這篇是寫 Xcode 3.1.x 的故事。 4.x 的使用者介面變很多,這篇教學可能不適合。

這篇是給新手看的。

如果你在 Windows 習慣使用 Visual C++ 或 Dev-C++ 的話,到了 Mac OS X 可能會突然不知道要怎麼寫程式,尤其當你已經用 Visual C++ 的 Debugger 用得很上手的話。

最近我們系上的課充滿了 C programming,我也稍微摸懂了 Xcode 的若干功能,至少我可以拿它來寫 C 語言的程式了,就像在 Windows 使用 Visual C++ 那樣。

如果這篇只是要教你怎麼按 Compile 的話,那我就是來騙文章數的了。因此這篇的內容還包括怎麼使用 Xcode 的 Debugger ,ㄎㄎ。


安裝 Xcode

首先當然是去 Apple 的網站 下載 Xcode (免錢,但需註冊 Apple Developer Connection 帳號,也是免錢),如果你買的機器夠新的話,可以直接拿出安裝光碟第一片,在「Optional Install」資料夾裡面找到最新的 Xcode 的安裝檔。下載回來裡面有一個橘色的包裹,按兩下然後照指示安裝 (通常就一直按「繼續」)。

安裝完成後,可以在「硬碟 → Developer → Applications」這個資料夾裡面找到 Xcode ,按兩下開啟。

新增 C 語言專案

按下功能表列的 「File → New Project」 … ,選擇「Command Line Tool」裡面的「Standard Tool

update: Xcode 3.1.2,選 Application ,右選邊 Command Line Utility,然後在下方選取你要用的語言,如 C (標準是 C89) 或 C++

image

接著按下 「Choose…」,輸入你要放置專案的目錄,並輸入專案名稱(會在你目前選擇的目錄裡再開一個新的資料夾),就好了。

image

這是 Xcode 的專案視窗基本配置。

image

上方工具列由左至右分別是:

  • Overview:編譯選項,可以選擇要在 Debug 模式或 Release 模式,以及目標作業系統 (10.4 或 10.5)
  • Action:一些針對專案快速呼叫的指令
  • Build:編譯
  • Build and Go:編譯並執行
  • Run:執行目前已編譯的程式(如果之前沒編譯的話就不能按)
  • Debug:進入除錯模式
  • Tasks:停止目前執行的程式。如果啟動多個程式,就有一個小三角形讓你選要停哪一隻
  • Info:取得簡介 (好像是廢話…)

自動完成

Xcode 的編輯器具備自動完成的功能。其實不用我介紹你應該就會了,因為你在打字的時候就會發現。變數名稱可以、#define token 可以、函式 prototype 可以、struct 元素也可以,甚至你在 #include 的時候也可以讓你看到有哪些 Library 你可以用的。

image

當游標後面出現反白的淡字,按下 Tab 會立刻套用目前顯示的自動完成,按下 Esc 可以讓你看到其他的可用自動完成。

image

而且大小寫通吃,如果變數名稱是大寫的,你直接打小寫還是可以做自動完成,按下 Tab 就會出現正確的大小寫;如果你繼續打,打到再也找不到自動完成,Xcode 就知道你要的不是這個變數名稱,就照著你打的大小寫輸出。

image

必須注意的是,如果你的函式是來自其他的 Header ,必須要先 Build 過 (error 也無妨) 才能出現自動完成。例如我剛引入 string.h ,但 Xcode 還不知道 string.h 裡面有什麼東西。按一下 Build 它就會把 string.h 裡面有的東西放入自動完成了。

image

編譯原始碼

「編譯與執行」這件事對於用慣 Visual C++ 的人應該不陌生,所以這裡也沒甚麼好說的。

Xcode 在出現編譯錯誤或警告的時候,會自動在編輯區出現錯誤,像這樣:

image

如此你就不必再到 Compile Output 裡面找看是哪一行了。

編譯的快速鍵是 Command + B ,直接按這個會比移動滑鼠游標還方便。

執行程式

Xcode 在執行程式的時候,並不是丟到終端機.app ,而是在它自己的 Console 裡面做輸入輸出的行為。可能是因為 Xcode 是以 GUI 應用程式為主要導向,所以預設它並沒有開啟 Console,你必須手動開啟,在 PreferencesDebugging 分頁裡面:

image

接著來試著執行一個具備輸入輸出的簡單程式。按下 Build & Go (快速鍵是 Command + R,跟 Safari 的重新整理是一樣的),操作方式就跟 Visual C++ 或 Dev-C++ 在命令提示字元裡面是差不多的,只是它背景是白色,而且程式結束不會把 Console 關掉:

image

如果你執行到一半想把程式關掉,只要按下紅色的八角牌 (Stop) 就行了。

教練,我想寫 ANSI C

你是否有這種經驗:當你的 C 程式寫好了,而且可以在自己的電腦編譯、執行,但丟到 Online Judge (例如 人稱 ACM 的那家 ,或 零架雞) 選 C 語言卻噴 Compile Error ?其實這是因為你沒有用標準的 ANSI-C 語法來寫。最明顯的差異在於,ANSI-C 不支援以 // 開頭的註解

那能不能強迫 Compiler 自動以 ANSI-C 模式編譯呢?well,這件事在 Visual C++ 做不到,但在 Xcode (或說使用 GNU C Compiler 為編譯器的 IDE) 就做得到:

首先在左欄的專案圖示上按滑鼠輔助鍵 (右鍵,或 Ctrl + 按一下),選擇 Get Info

image

切換到 Build 分頁,在右上角的搜尋框輸入 ansi 這四個字,你就會看到它像 Spotlight 一樣幫你找到這個選項: GCC 4.0 - Language / C Language Dialect 。把它改成 ANSI C [-ansi] 就行了。

image

現在再按 Build,你應該知道哪裡有錯了。

image

使用 Debugger

Xcode 最讓我喜歡的,是它與 GDB 有很好的整合,這對於我這種不熟悉命令列式 debugging 的人來說是相當棒的功能。 GDB 在命令列模式,你要自己下斷點(告訴它在第幾行)、自己下指令 backtrace, continue etc.);但有了 Xcode ,你只要有滑鼠就行了。

以下以一個簡單的小程式做範例:

a_simple_program.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <stdio.h>

/* global variables */
int i_am_a_global_variable;

/* functions */

void another_function (int* a)
{
  *a = 999;
  i_am_a_global_variable = (*a)++;
  return;
}

int some_function (int a)
{
  int some_local_var = a;
  printf("some_local_var has been changed to %d\n", some_local_var);
  another_function(&some_local_var);
  printf("some_local_var has been changed to %d\n", some_local_var);
  return 0;
}

int main (void)
{

  int number;
  printf ("enter number:");
  scanf("%d", &number);

  some_function(number);
  printf("You’ve entered %d\n", number);
  return 0;
}

在 GDB 裡面,斷點的定義是「在執行這一行之前先回到 debugger」,也就是說如果你把斷點設在第 12 行,那麼它會在執行第 12 行之前暫停程式執行,進入 debugger。

設斷點的方法很簡單,在行號上按一下滑鼠鍵就行了。斷點可以移動,用滑鼠拖曳便是。拿掉斷點,只要把它拉出行號區就行了,就像 Dock 一樣直觀操作。

現在我把斷點設在第 33 行,也就是 some_function(number) 這一行。

然後先按榔頭 (Build) 再按殺蟲劑 (Debug)。接著應該會開啟 Console。先在 Console 裡輸入數字,再按下 Enter,程式會立刻暫停。如果沒有出現 Debugger,那麼請按下功能表的 「Run → Debugger」 (快速鍵是 Shift + Command + Y)

你會看到 debugger 標示停在哪一行,右上角的窗格還會出現目前存在的區域變數

image

接著我再多設兩個斷點,分別在第 11 行和第 20 行 (不用停下來,直接按)。然後按下 Continue (一半暫停、一半播放的綠色圓形按鈕),當它執行到 another_function 這行之前,就會再暫停下來進入 Debugger 。你會發現左上角也有變化,沒錯,這個就是 Function Call 的 Stack。你可以在不同的 Stack 之間切換,右邊的窗格會出現不同的 Local Variables。

image

接著再按一下 Continue,會跳到第 13 行,出現第三層 Function Call。你會發現在右上角的窗格會顯示傳進去的指標的記憶體位址和指標所指的記憶體內容:

image

如果要看全域變數比較麻煩一點,因為 Xcode 設想在執行程式時所使用的 Library (System Call) 也可能存在許多你不想知道的全域變數,因此要手動開。

在 Debugger 右上角窗格的 Globals 左邊那個小三角形按一下(或在 Globals 字樣按兩下),會出現另一個視窗叫 Globals Browser,在左邊選取你的程式名稱,在右邊把你要顯示的全域變數打勾,關掉這個 Globals Browser,回到 Debugger,再按一下 Globals 的小三角形,就有啦。

image

這裡為了實驗這個功能,再多按一個斷點在第 12 行:

image

再來一個小範例,這次是陣列:

array.c
1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>

int main(void)
{
  int array[] = {1, 2, 3, 4, 5};
  int i;
  for (i = 0; i < 5; i++) {
    printf ("array #%d is %d\n", i, array[i]);
  }
  return 0;
}

我們把斷點設在第 8 行,再按 Build,再按 Debug ,你會發現它把陣列的內容顯示在右上方的窗格:

image

那如果是動態產生的陣列呢?

我們知道 malloc, calloc, realloc 傳回來的是它所分配到的記憶體的開頭位址,那 Xcode 會不會很聰明的把它當作陣列呢?

答案是….不會!雖然 Visual C++ 也不會。

我們把上面這段程式修改成 calloc 的方式:

dynamic_alloc.c
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
  int *array = (int *) calloc(5, sizeof(int));
  int i;
  for (i = 0; i < 5; i++) {
    printf ("array #%d is %d\n", i, array[i]);
  }
  free(array);
  return 0;
}

把斷點設在第七行 (int i; ),再 Build,按 Debug ,開啟 debugger:

image

從上圖我們知道兩件事:

  • 其一array 宣告成 int *,所以 Xcode 抓的是它的記憶體位址。
  • 其二、它用int 的方式去讀取 *array 指向的記憶體內容,所以得到的是首項的值 0 (calloc 會把分配到的內容全部清成 0 )。

那如果要看 array[1] 或其他內容的話怎麼辦呢?

這時候就要用 Expression Monitor 了,它在功能表的「Run → Show → Expressions…」,懶得選的話可以按 Help 然後輸入exp 搜尋

link

開啟 Expression 視窗,然後在下方輸入你要監視的運算式,當然也可以存取記憶體位址;要刪掉運算式的話直接選取然後按鍵盤上的 Delete (Backspace) 就行了:

image

Debugger 我會用的功能大概就這樣… 不過我覺得這樣也就夠了,用這些就足以 de 出邏輯上的錯誤。

字型設定

我們每天看 code 的人,總是希望它們要長得順眼,才看得下去。Xcode 當然也可以調整字型,不過改的方法跟一般的編輯器不太一樣。

首先進入 Xcode 的 Preferences 設定。

如果要改 Debugger Console 的字型的話,是在 Preferences 的 Debugging 分頁,選擇你要修改的項目,按一下「Set Font…」就行了:

image

不過它有五項可以調整,如果你有改其中一項的話,建議其他四項也改一改,看起來比較協調:

image

至於程式碼編輯區的字型,則是放在 Fonts & Colors 裡面。不過因為要改的項目實在太多,~~就改天吧,~~ 這裡教你一個小撇步:先按 Command + A 全選,然後在第二欄按兩下,就可以一次改全部了:

image



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值