Objective C 學習筆記 12 預處理程式

2021-07-05 07:12:35 字數 1284 閱讀 9168

「#define true 1

定義名稱true 使它等於值1。

gameover = true;

使用了預定義名稱true,指定值true給gameover。

預定義後面沒有分號。給true賦值也沒有用等號。

,#define 語句很特別,經常放在程式開始的地方,#import 或者include之後,這並不是必須的,也可以放在程式的任何地方,但是在程式引用這個名稱之前,必須先定義它們,預定義名稱沒有區域性定義的說法,在定義乙個名稱之後,就可以在程式的任何地方使用它。

習慣上,程式設計師喜歡把大寫字母作為常量名稱這樣更加容易區分,預定義名。或者在定義之前加上字母k。

12.1.2更高階的定義型別

預定義乙個表示式,預定義本身也可以作為預定義的值。或者是乙個字元。

,#define two_pi 2.0 * 3.14

,#define pi 3.14

,#define two_pi 2.0 * pi

如果預定義程式假設定義包含在程式的一行中,如果需要第二行,那麼上一行的最後乙個字元必須是反斜線符號。

if (year % 4 ==0 && year %100 != 0 || year % 400 ==0)

…,#define is_leap_year year % 4 == 0 && year %100 != 0 \ ||year % 400 ==0

在執行帶有引數的預定義時,預定義名稱和引數列表的左括號之間不能有空格。

,#define ,#define is_leap_year(y) y % 4 == 0 && y % 100\ != 0 || y % 400 ==0

這裡沒有定義引數型別,所以只是執行字面上的替換。

按照前面的語句可以編寫如下:

if ( is_leap_year(year) )

… 只要出現y,就用year來替換它。

在定義巨集時,有乙個有趣的陷阱。

,#define square(x) x * x

y = square(v);

把v * v 賦值給y ,如果是以下語句:

y = square(v + 1)

這樣的語句並不會想期望的那樣,把(v + 1)的平方賦值給y,因為預處理程式是對巨集定義的引數實行文字替換,會得到以下求值:

y = v + 1 * v + 1;

要解決這個問題我們要在定義中加入括號:

,#define square(x) ( (x) * (x) )

,#ifdef, #endif ,#else, #ifndef語句

Objective C學習筆記1

這幾篇筆記是讀 objective c基礎教程 learn objective c on the mac for os x and ios 第二版 做的筆記。主要是一些讀書時遇到的疑惑,都是自己的理解,不一定正確,紀錄下來方便以後查閱,內容比較基礎,對剛入門ios的朋友也許有些幫助。1,關於bool...

Objective C 學習筆記

1 is a 是乙個 繼承,提高執行效率,減少重複 2 has a 有乙個 復合,物件引用其它物件時,利用其它物件特性。3 返回屬性值的訪問方法,名稱中不能使用get這個詞 4 類名首字母大寫,變數首字母小寫。5 在objective c中所有物件間互動都是通過指標實現的。6 指標值被賦值,只有乙個...

Objective c學習筆記

property是object c的乙個特性,可以讓我們輕鬆實現成員變了的setting和getting方法。具體的語法如下 以成員變數nsstring m name為例 標頭檔案中宣告如下 property nsstring m name m檔案實現 synthesize m name 這樣我們便...