Objective-C #define 用法解析

來源:互聯網
上載者:User

原文地址:

http://blog.csdn.net/kindazrael/article/details/8108868

 

Objective-C : #define 用法解析

在 C 語言中,預先處理代碼 (Preprocessor) 是非常強大的工具,能讓你的代碼變得更加易讀和易改。利用預先處理代碼,你可以重新定義代碼的一部分,使得你的代碼更適合你的風格。預先處理代碼 (Preprocessor) 在代碼編譯之前被提前處理。預先處理代碼均由一個井號 (#) 打頭。

1. 關於  #define

#define 聲明主要用於將常量(或字串)賦予有意義的名字,比如當你在編寫一個行事曆程式時,可以定義:

#define MONTHS_PER_YEAR 12

 

請注意格式。#define 命令之後為常量名,再之後為所賦的代替值,用空格隔開,結尾不需分號。

#define 常量名 代替值

通常情況下,習慣將預先處理的常量名全大寫,單詞之間用底線隔開(與正常變數區分)。這樣做的原因是在編譯器處理這段 #define 代碼時,會自動尋找空格,空格之後的被認為是代替值。這也是為什麼在每一行代碼的末尾不用加分號的原因,因為如果加了分號,分號本身也會被認為是代替值的一部分。

一個被定義的常量名並不是一個變數;它的值一旦被定義,便不能再被改變。 #define 聲明通常位於一個檔案的頂部,緊接在 #import 檔案匯入定義之後。需要注意的是, #define 聲明必須位於常量名使用之前(不像方法 (method) 可以放在檔案中任意位置)。

使用 #define 的另一個例子是儲存一些有意義的數值, 比如

#define PI 3.141592654// 計算圓的面積使用 "PI * radius * radius" 即可

 

,這比處處書寫 3.141592654 要方便許多。(改起來也快很多)
 

2. 更進階的用途

注意,預先處理代碼起的作用實際上相當於在編譯之前,在整個代碼中進行了一次“搜尋、替換”功能。這意味著 #define 有許多更複雜、更進階的用途。

我們先從 2π 開始,將 TWO_PI 定義為 2π:

#define TWO_PI 2.0 * 3.141592645

 

由於我們之前曾定義過 π,我們同樣可以在定義中使用定義後的常量名來指代:

#define TWO_PI 2.0 * PI

 

除了常量以外,你還可以利用預先處理定義 Objective-C 代碼中任意一段字元或字串,例如:

#define AND &&#define OR ||#define EQUALS ==if (y EQUALS 0 OR y EQUALS 1) // …

 

合理地利用 #define,可增強代碼的可讀性。對比下列兩行代碼:

if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))// 或#define IS_LEAP_YEAR (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)if (IS_LEAP_YEAR) // 代碼可讀性更強。

 

一個定義通常應在一行代碼中完成。但如果你需要手動空行,那麼在每行後輸入一個後劃線(\)即可將幾行代碼串連起來成為一行。例如:

#define IS_LEAP_YEAR(y) (y % 4 == 0 && y % 100 != 0) \|| (y % 400 == 0)if ( IS_LEAP_YEAR(currentYear) ) 

 

 

3. 宏

#define 聲明中還可以使用參數,並且可使用多個參數;這一特性被稱為“宏”:

如:

#define SQUARE(x) ( (x) * (x) )

 

此時, y = SQUARE(v + 1); 等價於 y = ( (v + 1) * (v + 1) );

兩個參數

例如,你可以定義:

#define CalcInterest(x,y) ( x * y )

 

代碼中便可書寫:

int earnings = CalcInterest(10,5));

 

多個參數

例如,在代碼中,你需要頻繁使用 [NSArray arrayWithObjects: object, ..., nil] 這一命令。利用#define,你可以簡化代碼:

#define Array(FIRST, ...) [NSArray arrayWithObjects: FIRST, ##__VA_ARGS__, nil]

 

其中 ##__VA_ARGS__ 用於表示省略符號所代表的所有內容。
 

4. # 算符以及 ## 算符

# 算符可產生一個 C-語言 格式的字串。如:

#define string(x) #x //則 string(testing) == "testing"

 

## 算符用來串連兩段字串。假設你有一組變數,x1 到 x100。如果你想列印其中某一個變數的值。你可以這樣定義:

#define printxvar(n) printf("%i\n", x ## n)

 

由此, printxvar(20); 在編譯時間將被識別為 printf(“%i\n”, x20);。這樣只需要輸入 printxvar(n);便可以列印出 xn 的值。

其實,##最常用的用途還是上面介紹的 ##__VA_ARGS__,它可用來抓取省略符號所代表的所有內容。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.