在 c 語言中,預處理** (preprocessor) 是非常強大的工具,能讓你的**變得更加易讀和易改。利用預處理**,你可以重新定義**的一部分,使得你的**更適合你的風格。預處理** (preprocessor) 在**編譯之前被提前處理。預處理**均由乙個井號 (#) 打頭。
#define
宣告主要用於將常量(或字串)賦予有意義的名字,比如當你在編寫乙個日曆程式時,可以定義:
#define months_per_year 12請注意格式。
#define
命令之後為常量名,再之後為所賦的代替值,用空格隔開,結尾不需分號。
#define 常量名 代替值通常情況下,習慣將預處理的常量名全大寫,單詞之間用下劃線隔開(與正常變數區分)。這樣做的原因是在編譯器處理這段
#define
**時,會自動尋找空格,空格之後的被認為是代替值。這也是為什麼在每一行**的末尾不用加分號的原因,因為如果加了分號,分號本身也會被認為是代替值的一部分。
乙個被定義的常量名並不是乙個變數;它的值一旦被定義,便不能再被改變。#define
宣告通常位於乙個檔案的頂部,緊接在#import
檔案匯入定義之後。需要注意的是,#define
宣告必須位於常量名使用之前(不像方法 (method) 可以放在檔案中任意位置)。
使用#define
的另乙個例子是儲存一些有意義的數值, 比如
#define pi 3.141592654,這比處處書寫 3.141592654 要方便許多。(改起來也快很多)// 計算圓的面積使用 "pi * radius * radius" 即可
注意,預處理**起的作用實際上相當於在編譯之前,在整個**中進行了一次「搜尋、替換」功能。這意味著#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"## 算符用來連線兩段字串。假設你有一組變數,
x1
到x100
。如果你想列印其中某乙個變數的值。你可以這樣定義:
#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的一些配置資訊,發現指定了...