声明:以下内容非本人原创,转载于别处。拿出来只是分享给FY们,不喜勿喷!原创地址http://blog.yorkxin.org/posts/2009/03/15/fundamental-c-with-xcode/
如何用 OS X 的 Xcode 写 C 语言程序(这篇是给新手朋友看的)
如果你在Windows习惯使用Visual C++ 或Dev-C++的话,到了Mac OS X可能会突然不知道要怎么写程式,尤其当你已经用Visual C++的Debugger用得很上手的了;如果这篇只是要教你怎么按Compile的话,那我就是来骗文章数的了,因此这篇的內容还包括怎么使用Xcode的Debugger 。第一次打开Xcode你会看到Welcome to Xcode的画面,做为第一次尝试,请先按下Create a new Xcode Project 。
Welcome to Xcode 这个画面若以后不想看到,可以取消勾选Show this window when Xcode launches 来永久关闭,往后若要打开新方案,可以按下功能表的File → New → Project ... 。
新增 C 语言方案
刚刚说按下 「Create a new Xcode Project」,接著会跳出一个视窗,问你要开什么方案。对于一般 C 程式作业来说,它被归类在OS X的命令列工具里面,所以,在左侧OS X里面的Application ,然后在右边选Command Line Tool 。
接著会要你输入方案名称,Organization Name 写你的名字就行, Company Identifier 我不知道是做什么的(我不是专门写 OS X 软件的),但並不会影响接下的的操作,所以像我这样填一个看起來像样的就行。最下面的Type可以选C 或 C++ ,还有其他 Objective-C-based Frameworks,这里我直接选 C 。
最后按下Next ,会要你找一个地方放这个方案,你就找个地方放就行了。
认识 Xcode IDE
Xcode IDE的界面一打开跟 Visual Studio 、 Dev-C++ 都不一样,从 Windows 来的人可能回不太习惯,不过不要紧,只要认识个东西就好了。但在开始认识之前,请先到Xcode → Preferences... 里面的Behaviors ,选 Running → Starts,把Show debugger 打开,並且把Debug Area 打开,在 View → Debug Area → Show Debug Area 。这个预设沒开,但接下来会用到,非常重要,所以先打开。
接下来来认识一下 Xcode Project 视窗的基本配置:
请先认识:
- 「执行」按钮(Run) ,长得像音乐软件的 Play ,按下去就是执行程序
- 「停止」按钮 (Stop) ,长得像音乐软件的Stop ,在程序执行的時候可以強制停止
- 「状态栏」 ,在最上方,会出现的状态像是编译或执行的成功与否
- 「左側栏」 ,現在是显示档案列表(有其他列表可以切换)
- 「主要工作区」 ,现在里面是看不懂的东西,等下会切换到程序码编辑
- 「除错区」 ,让你方便对程式码除错,我会特別讲这一个区域。
第一次执行行程式
写程序除了撰写程序码本身,最重要的就是要跑程序来看结果。刚刚介紹了「执行」按钮,看起來可以按它來执行程式,那麼就按按看吧。按下去之後,你會看到狀態列的訊息有所改變,提示 Building 、 Build Success 、Running 等等,最後,你會在 Debug Area 的右邊看到這個:
嗯,程式可以執行,可以看到輸出了。
第一次修改程式
但是到現在還沒看到程式碼,剛剛說了左側欄是切換到「檔案列表」,也就是說檔案藏在裡面,請找一下 main.c ,按一下可以打開,主要工作區會變成程式碼:
這個程式碼你應該很熟悉,就是普通的 C 語言 Hello World 而已。
自動完成
接下來請試試看修改程式。假如我想要改成印出 10 次 Hello World 的內容,想必你會在 // insert code here 這邊加 for loop:
[color=#2aa198 !important]int [color=#268bd2 !important]i;[color=#cb4b16 !important]for ([color=#268bd2 !important]i = [color=#2aa198 !important]0; [color=#268bd2 !important]i < [color=#2aa198 !important]10; [color=#268bd2 !important]i++) { [color=#268bd2 !important]printf([color=#2aa198 !important]"Hello, World[color=#dc322f !important]\n[color=#2aa198 !important]");}
你打到一半的時候應該會出現這樣子的東西:
這個功能叫做 「自動完成」 (Auto Complete) ,是 Xcode 好用的功能之一,如果你從 Visual Studio 過來應該不陌生,就是打到一半,Xcode 會自動提示你可以寫什麼程式碼,並且按下Tab 就可以自動跳到圓框來打字。你可以試試看,按 Tab 來切換,然後按 Enter 來確認。自動完成其實無所不在,除了可以自動展開 Syntax 之外,還可以展開變數名稱、function 名稱(統稱 identifiers)、提示有哪些 .h 檔可以 include 、提示 struct 的結構。展開 identifers 的例子像是,你想要用 fputs ,打 fp ,它會自動出現所有 fp 開頭的函式(因為有 include stdio.h ,所以抓得到),按鍵盤的上下鍵可以選擇,除此之外,還會在右側欄出現簡單的說明。如果你按 More 的話,還會出現完整的說明檔,這樣子就不需要上網查文件了。
再提一個秘訣,想要手動 trigger 自動完成的話,可以按 Esc 。例如我先宣告了 var1, var2, var3 ,想要對其中一個指定某值,打到一半只有 var 就跑到別行,再回來的話,可以在 var 的後方按 Esc ,就會跳出自動完成:
附帶一提,大小寫隨便打,它也認得出來。你可以隨便試,你應該會感受到「他好像很聰明的樣子」。
自動錯誤提示
我改好了,結果 oops ,好像忘記什麼東西?
程式寫錯,不用到編譯才知道, Xcode 會一直自動編譯,檢查你程式碼是否可以編譯通過,並且自動 標示錯誤 ,如果你按下行號旁邊的紅色驚嘆號,它會告訴你錯在哪:
對,忘記说了,補起來之後,這個錯誤訊息就會消失了。錯誤訊息除了程式寫錯無法編譯之外,還會有編譯器來的警告,例如有個變數宣告了但沒使用:
如何,很方便吧?
執行程式與輸入資料
現在再來 Run 一遍,這次不要動滑鼠了,請按鍵盤上的 Command + R ,一樣會跑「執行」:
如果是從 Visual Studio 或 Dev-C++ 過來的,你可能會覺得奇怪,為什麼不是熟悉的黑底白字畫面?其實 Xcode 在執行的時候,並不是開一個新的終端機程式,而是直接在自己的 Console 裡面輸入輸出,我猜測這理由是因為 Xcode 是以 GUI 應用程式為主要導向,所以 Console 簡略就好,並且因為 OS X 是一種 UNIX 作業系統,天生就有輸入輸出轉向,可以直接接到 Xcode 裡面也很自然(這個在系統程式的課會教)。話說回來 Eclipse 好像也是長這樣。不過,預設它並不會在執行的時候自動打開 Console,你必須手動開啟,所以一開始我才會請你先打開 Debug Area 。接著來試著執行一個具備輸入輸出的簡單程式,輸入整數 n ,輸出 n 次 "Hello, World!\n"。
[color=#2aa198 !important]int [color=#268bd2 !important]main([color=#2aa198 !important]int [color=#268bd2 !important]argc, [color=#cb4b16 !important]const [color=#2aa198 !important]char *[color=#268bd2 !important]argv[]){ [color=#2aa198 !important]int [color=#268bd2 !important]i, [color=#268bd2 !important]n; [color=#cb4b16 !important]if ([color=#268bd2 !important]fscanf([color=#268bd2 !important]stdin, [color=#2aa198 !important]"%d", &[color=#268bd2 !important]n) == [color=#2aa198 !important]1) { [color=#cb4b16 !important]for ([color=#268bd2 !important]i = [color=#2aa198 !important]0; [color=#268bd2 !important]i < [color=#268bd2 !important]n; [color=#268bd2 !important]i++) { [color=#268bd2 !important]printf([color=#2aa198 !important]"Hello, World![color=#dc322f !important]\n[color=#2aa198 !important]"); } } [color=#cb4b16 !important]return [color=#2aa198 !important]0;}
按下 Run ,然後在 Console 裡面輸入 3 ,它就會輸入整數 n = 3 ,並且印出 3 次 Hello, World! ,跟我們想要的行為一致。
如果你執行到一半想把程式關掉,只要按下 Stop 就行了。
使用 Debugger
跟 Visual Studio 一樣,專業的 IDE 一定要有完美的 Debugger 整合,而 Xcode 當然也有,這對於我這種不熟悉命令列式 debugging 的人來說是相當棒的功能。 一般的命令列 debugger 要自己下斷點(告訴它在第幾行)、自己下指令,但有了 Xcode ,你只要動滑鼠就行了。以下以一個簡單的小程式做範例:
[color=#93a1a1 !important]#include <stdio.h>[color=#93a1a1 !important]/* global variables */[color=#2aa198 !important]int [color=#268bd2 !important]i_am_a_global_variable = [color=#2aa198 !important]999;[color=#93a1a1 !important]/* functions */[color=#2aa198 !important]void [color=#268bd2 !important]another_function ([color=#2aa198 !important]int* [color=#268bd2 !important]a){ (*[color=#268bd2 !important]a)++; [color=#268bd2 !important]i_am_a_global_variable += *[color=#268bd2 !important]a; [color=#cb4b16 !important]return;}[color=#2aa198 !important]int [color=#268bd2 !important]some_function ([color=#2aa198 !important]int [color=#268bd2 !important]a){ [color=#2aa198 !important]int [color=#268bd2 !important]some_local_var = [color=#268bd2 !important]a; [color=#268bd2 !important]printf([color=#2aa198 !important]"some_local_var has been changed to %d[color=#dc322f !important]\n[color=#2aa198 !important]", [color=#268bd2 !important]some_local_var); [color=#268bd2 !important]another_function(&[color=#268bd2 !important]some_local_var); [color=#268bd2 !important]printf([color=#2aa198 !important]"some_local_var has been changed to %d[color=#dc322f !important]\n[color=#2aa198 !important]", [color=#268bd2 !important]some_local_var); [color=#cb4b16 !important]return [color=#2aa198 !important]0;}[color=#2aa198 !important]int [color=#268bd2 !important]main ([color=#2aa198 !important]void){ [color=#2aa198 !important]int [color=#268bd2 !important]number; [color=#268bd2 !important]printf ([color=#2aa198 !important]"enter number:"); [color=#cb4b16 !important]if ([color=#268bd2 !important]fscanf([color=#268bd2 !important]stdin, [color=#2aa198 !important]"%d", &[color=#268bd2 !important]number) == [color=#2aa198 !important]1) { [color=#268bd2 !important]some_function([color=#268bd2 !important]number); [color=#268bd2 !important]printf([color=#2aa198 !important]"You’ve entered %d[color=#dc322f !important]\n[color=#2aa198 !important]", [color=#268bd2 !important]number); } [color=#cb4b16 !important]else { [color=#268bd2 !important]printf([color=#2aa198 !important]"No number entered. Bye.[color=#dc322f !important]\n[color=#2aa198 !important]"); } [color=#cb4b16 !important]return [color=#2aa198 !important]0;}
斷點的定義是 「在執行這一行之前先回到 debugger」 ,也就是說如果你把斷點設在第 12 行,那麼它會在執行第 12 行之前暫停程式執行,進入 debugger。設斷點的方法很簡單,在行號上 按一下滑鼠左鍵 就行了。斷點可以移動,用滑鼠拖曳便是。斷點可以暫時取消,即是點一下讓它變成淺藍色。斷點可以刪除,只要把它 拖曳出行號區 就行了,就像 Dock 一樣直觀操作。現在我把斷點設在 some_function(number) 這一行。
然後執行程式,先在 Console 裡輸入數字,再按下 Enter 輸入到程式裡。接著,程式會立刻暫停,你會看到程式碼裡面,標示了停在哪一行,而 Debug Area 左側還會出現目前存在的區域變數。Debug Area 有個工具列,上面有幾個重要的按鈕,用途如圖:
這裡要先介紹通常 Debugger 會有的指令:
- Continue (繼續) :離開 Debugger 繼續執行程式,可能會中斷在下一個斷點
- Step Over (跳過) :跳過(執行)這一行,然後停在下一行
- Step Into (跳入) :目前在的這一行有函式,跳進去
- Step Out (跳出) :目前在的這一行是在某個函式裡面,跳出去到呼叫函式的程式(也就是 return 完畢)
熟悉這四個指令,你就可以在程式碼之間遊走了。接著我再多設兩個斷點,分別在 i_am_a_global_variable += 和 another_function(&some_local_var); 這兩行(不必先把程式停下來,直接按滑鼠左鍵加斷點)。然後按下 Continue ,當它執行到 another_function 這行之前,就會再停下來進入 Debugger 。你會發現左邊也有變化,因為進入了 Function Call 的 Stack 。你可以在不同的 Stack 之間切換,左邊也會出現不同的 Local Variables,切換的方式是按下 Debugger 導覽列的 function name。
接著再按一下 Continue,會跑進 another_function 裡面,你會發現在左邊窗格會顯示傳進去的指標的記憶體位址和指標所指的記憶體內容,以及,因為這個 function 有參照 (reference) 到全域變數 i_am_a_global_variable ,所以 Xcode 也會自動列出:
再來一個小範例,這次是陣列:
[color=#93a1a1 !important]#include <stdio.h>[color=#2aa198 !important]int [color=#268bd2 !important]main([color=#2aa198 !important]void){ [color=#2aa198 !important]int [color=#268bd2 !important]array[] = {[color=#2aa198 !important]1, [color=#2aa198 !important]2, [color=#2aa198 !important]3, [color=#2aa198 !important]4, [color=#2aa198 !important]5}; [color=#2aa198 !important]int [color=#268bd2 !important]i; [color=#cb4b16 !important]for ([color=#268bd2 !important]i = [color=#2aa198 !important]0; [color=#268bd2 !important]i < [color=#2aa198 !important]5; [color=#268bd2 !important]i++) { [color=#268bd2 !important]printf ([color=#2aa198 !important]"array #%d is %d[color=#dc322f !important]\n[color=#2aa198 !important]", [color=#268bd2 !important]i, [color=#268bd2 !important]array[[color=#268bd2 !important]i]); } [color=#cb4b16 !important]return [color=#2aa198 !important]0;}
斷點設在 printf 那一行,然後執行,你會發現它把陣列的內容也列出來了(按 ▼ 可以展開):
那如果是動態產生的陣列呢?我們知道 malloc, calloc, realloc 傳回來的是它所分配到的記憶體的開頭位址,那 Xcode 會不會很聰明的把它當作陣列呢?我們把上面這段程式修改成 calloc 的方式:
[color=#93a1a1 !important]#include <stdio.h>[color=#93a1a1 !important]#include <stdlib.h>[color=#2aa198 !important]int [color=#268bd2 !important]main([color=#2aa198 !important]void){ [color=#2aa198 !important]int *[color=#268bd2 !important]array = ([color=#2aa198 !important]int *) [color=#268bd2 !important]calloc([color=#2aa198 !important]5, [color=#cb4b16 !important]sizeof([color=#2aa198 !important]int)); [color=#2aa198 !important]int [color=#268bd2 !important]i; [color=#cb4b16 !important]for ([color=#268bd2 !important]i = [color=#2aa198 !important]0; [color=#268bd2 !important]i < [color=#2aa198 !important]5; [color=#268bd2 !important]i++) { [color=#268bd2 !important]array[[color=#268bd2 !important]i] = [color=#268bd2 !important]i + [color=#2aa198 !important]1; [color=#268bd2 !important]printf ([color=#2aa198 !important]"array #%d is %d[color=#dc322f !important]\n[color=#2aa198 !important]", [color=#268bd2 !important]i, [color=#268bd2 !important]array[[color=#268bd2 !important]i]); } [color=#268bd2 !important]free([color=#268bd2 !important]array); [color=#cb4b16 !important]return [color=#2aa198 !important]0;}
把斷點設在 free(array) 那一行,然後執行,你會發現 Debugger 並不會列出 array 的內容,而是只有指標:
從上圖我們知道兩件事:array 宣告成 int *,所以 Xcode 抓的是它的記憶體位址。它用 int 去解讀 *array 指向的記憶體內容,所以得到的是首項的值 1,因為 array 的內容是 1, 2, 3, 4, 5。那如果要看 array[1] 或其他內容的話怎麼辦呢?這時候就要用 Expression Monitor 了,可以在這個 variable 列表裡面按右鍵選 Add Expresssion... ,然後輸入 array[1] 就行了。另外,既然是 Expression ,當然可以輸入運算式,例如 array[1] + 2 。
Debugger 我會用的功能大概就這樣... 不過我覺得這樣也就夠了,用這些就足以抓出邏輯上的錯誤。
字型設定
我們每天看 code 的人,總是希望它們要長得順眼,才看得下去。Xcode 當然也可以調整字型。進入 Xcode 的 Preferences 設定,在 Fonts & Colors 分頁裡面。不過每個項目是分開的,要一次改的話,是先按 Command + A 全選,然後按下 T 那個 icon ,就可以一次改全部了。附帶一提, Console 的字型是在同一個畫面的「Console」分頁裡面。
如何用OS X的Xcode写C语言程序
时间: 2024-11-05 21:44:07
如何用OS X的Xcode写C语言程序的相关文章
在android系统上写C语言程序--开机启动该程序不进入安卓系统
今天要写的这篇博文意义重大,也是网上很少有的,这是在我工作中学会的一项技术,当然,它也是由简单的问题组合而来的.如何在安卓中写C语言程序,调试安卓驱动,测试程序的的一项重要技能,下面我就不说废话了,直接说实用的,怎么用这个东西. 关于这个问题,相信很多学Android的都会去关注这个问题,大家普遍会有个这样的疑问:安卓是怎么跑起来的? 最简单的说法,安卓系统是这样加载的: Bootloader------Kernel(对应平台版本的Linux内核)------filesystem文件系统(这个就
【Xcode学C-1】如何用Xcode练习C语言,并练习一个输出例子,以及重要的注意事项
直接用Xcode学习C语言,为iOS开发打基础. (1)选择OS X >>> Application >>> Command Line Tool (2)输入产品名称,公司唯一标识.应用程序唯一标识=公司唯一标识+产品名称. 注意:公司唯一标识一般是域名倒过来写,如www.hellocation.com,那么写成com.hellocation. 注意:选择C语言.默认是OC,所以我们在学习OC的时候没有做任何动作. (3)进入程序后,点击main.c程序源文件,有一段现
android:如何用一天时间,写出“飞机大战”这样的游戏!(无框架-SurfaceView绘制)
序言作为一个android开发者,时常想开发一个小游戏娱乐一下大家,今天就说说,我是怎么样一天写出一个简单的"飞机大战"的.体验地址:http://www.wandoujia.com/apps/edu.njupt.zhb.planegame游戏分析玩过"飞机大战"游戏的都知道,飞机大战中的主要"角色"有:1.玩家飞机2.敌方飞机3.玩家飞机发送的子弹4.敌方Boss飞机发送的子弹我们需要控制的有:1.绘制屏幕内的角色2.控制角色的逻辑,比如:敌方
iOS开发中 Mac OS X 及Xcode 常用快捷键
版权声明:本文为博主原创文章,转载请注明出处,仅用于学习交流和资源共享.关注新浪微博:极客James 在学习iOS开发之前要熟悉OS X 系统以及开发工具XCode的使用,作为程序员不用鼠标是装B的首选,下面就来介绍下常见的操作,每一个快捷键都可以试一试 常用快捷键: Xcode常见的快捷键
【Xcode学C-1】怎样用Xcode练习C语言,并练习一个输出样例,以及重要的注意事项
直接用Xcode学习C语言,为iOS开发打基础. (1)选择OS X >>> Application >>> Command Line Tool (2)输入产品名称,公司唯一标识.应用程序唯一标识=公司唯一标识+产品名称. 注意:公司唯一标识通常是域名倒过来写,如www.hellocation.com.那么写成com.hellocation. 注意:选择C语言.默认是OC.所以我们在学习OC的时候没有做不论什么动作. (3)进入程序后,点击main.c程序源文件,有一段
Linux内核学习--写一个c程序,并在内核中编译,运行
20140506 今天开始学习伟大的开源代表作:Linux内核.之前的工作流于几个简单命令的应用,因着对Android操作系统的情愫,"忍不住"跟随陈利君老师的步伐,开启OS内核之旅.学习路径之一是直接从代码入手,下面来写一个hello.c内核模块. 说明: 这个路径/usr/src/linux-headers-2.6.32-22/include/linux是引用的头文件. 内核模块固定格式:module_init()/ module_exit(),module函数是从头文件中来的.
02-编写第一个C语言程序
1.打开Xcode,新建Xcode项目 2.选择最简单的命令行项目 3.输入项目信息 4.选择一个用来存放C程序代码的文件夹 5.运行项目 说明:这个C语言专题,是学习iOS开发的前奏.也为了让有面向对象语言开发经验的程序员,能够快速上手C语言.如果你还没有编程经验,或者对C语言.iOS开发不感兴趣,请忽略 由于我们最终要学习的是iOS开发,因此就使用Mac平台下的Xcode搭建C语言开发环境,而不使用Windows系统 如果你是在Windows环境下,可以下载这个简单的C语言学习工具:C/C+
写给 iOS 程序员看的 C++(2)
原文:Introduction to C++ for iOS Developers: Part 2 作者:Matt Galloway 译者:kmyhy 欢迎回到<写给 iOS 程序员看的 C++ 教程系列>第二部分! 在第一部分,你学习了类和内存管理. 在第二部分,你将进一步深入类的学习,以及其他更有意思的特性.你会学习什么是模板以及标准模板库. 最后,你将大致了解 Objectiv-C++--一种将 C++ 混入 Ojective-C 的技术. 准备好了吗?让我们开始吧! 多态 这里的多态不
写一个c语言程序
在Mac系统环境下编写第一个C语言程序,最后把程序运行起来,跟计算机做一个小小的互动 一.编写第一个C语言程序-Hello World 为什么称第一个程序为“Hello Wolrd”呢?其实计算机行业里面,学习任何技术的第一个程序都可以称为“Hello World”.“Hello World”的字面意思是“你好,世界”,也就是跟世界打招呼.我们第一个程序在这世界上诞生了,那肯定要跟世界打声招呼嘛,所以就称为“Hello World”. 1.用什么工具写代码 首先我们要做的肯定是写代码,在代码里面