Objective C define 用法解析

2021-06-10 12:41:13 字數 2772 閱讀 2172

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

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

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

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

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

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

#define pi 3.141592654

// 計算圓的面積使用 "pi * radius * radius" 即可

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

注意,預處理**起的作用實際上相當於在編譯之前,在整個**中進行了一次「搜尋、替換」功能。這意味著#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) )

#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__用於表示省略號所代表的所有內容。

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

#define string(x) #x //則 string(testing) == "testing"
## 算符用來連線兩段字串。假設你有一組變數,x1x100。如果你想列印其中某乙個變數的值。你可以這樣定義:

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

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

Objective C define 用法解析

在 c 語言中,預處理 preprocessor 是非常強大的工具,能讓你的 變得更加易讀和易改。利用預處理 你可以重新定義 的一部分,使得你的 更適合你的風格。預處理 preprocessor 在 編譯之前被提前處理。預處理 均由乙個井號 打頭。define宣告主要用於將常量 或字串 賦予有意義的...

python add argument 用法解析

argparse argparse 是 python 內建的乙個用於命令項選項與引數解析的模組,通過在程式中定義好我們需要的引數,argparse 將會從 sys.ar 中解析出這些引數,並自動生成幫助和使用資訊。當然,python 也有第三方的庫可用於命令列解析,而且功能也更加強大,比如 doco...

Docker Dockerfile用法全解析

dockerfile基本的指令 from workdir copy 本地目錄移動 add url目錄等 run 映象構建執行shell 語句 cmd 容器執行執行的shell 語句 entrypoint docker inspect nginx latest 檢視nginx的一些配置資訊,發現指定了...