鍍金池/ 教程/ C/ Objective-C 預(yù)處理器
Objective-C 多態(tài)性
Objective-C 預(yù)處理器
Objective-C for循環(huán)
Objective-C 開發(fā)環(huán)境(安裝配置)
Obj-C Foundation/基礎(chǔ)框架
Objective-C 指針運算
Objective-C 循環(huán)
Objective-C 錯誤處理
Objective-C while循環(huán)
Objective-C if語句
Objective-C do...while循環(huán)
Objective-C教程
Objective-C 嵌套switch語句
Objective-C 函數(shù)按值調(diào)用
Objective-C 常量
Objective-C 運算符
Objective-C 數(shù)據(jù)類型
Objective-C 邏輯運算符
Objective-C 數(shù)組作為函數(shù)參數(shù)傳遞
Objective-C struct/結(jié)構(gòu)
Objective-C 嵌套循環(huán)
Objective-C 函數(shù)引用調(diào)用
Objective-C 日志處理
Objective-C 數(shù)據(jù)存儲
Objective-C 教程首頁
Objective-C 擴展
Objective-C 異常處理
Objective-C 類型轉(zhuǎn)換
Objective-C 嵌套 if 語句
Objective-C typedef
Objective-C 決策
Objective-C 指針的數(shù)組
Objective-C Protocols/協(xié)議
Objective-C 日期和時間
Objective-C 指針
Objective-C 內(nèi)存管理
命令行參數(shù)
Objective-C NSString/字符串
Objective-C 動態(tài)綁定
Objective-C 復(fù)合對象
Objective-C Arrays/數(shù)組
Objective-C 位運算符
Objective-C 指向指針的指針
Objective-C 從函數(shù)返回數(shù)組
Objective-C Posing/冒充
Objective-C Categories/類別
Objective-C 文件處理
Objective-C 賦值運算符
Objective-C 函數(shù)返回指針
Objective-C if...else 語句
Objective-C switch語句
Objective-C URL加載系統(tǒng)
Objective-C 算術(shù)運算符
Objective-C Numbers/數(shù)字
Objective-C語言程序結(jié)構(gòu)
Objective-C 快速枚舉
Objective-C 基本語法
Objective-C 類&對象
Objective-C 變量
Objective-C 關(guān)系運算符
Objective-C 塊
Objective-C break語句
Objective-C continue語句
Objective-C 語言概述
Objective C 文本和字符串
Objective-C 函數(shù)
Objective-C 傳遞函數(shù)的指針
Objective-C 數(shù)組的指針
Objective-C 多維數(shù)組
Objective-C 繼承
Objective-C 數(shù)據(jù)封裝

Objective-C 預(yù)處理器

Objective-C的預(yù)處理器是不是編譯器的一部分,但是在編譯過程中是一個單獨的步驟。在簡單的條件,是一個Objective-C預(yù)處理器只是一個文本替換工具,它指示編譯器做實際的編譯之前需要預(yù)先處理。我們會參考Objective-C的預(yù)處理為OCPP。

井號(#)開頭的所有預(yù)處理命令。它必須是第一個非空字符,可讀性,預(yù)處理器指令應(yīng)在第一列開始。下節(jié)列出了所有重要的預(yù)處理指令:

指示 描述
#define 替代預(yù)處理宏
#include 從另一個文件中插入一個特定的頭
#undef 取消定義預(yù)處理宏
#ifdef 如果定義了這個宏返回true
#ifndef 返回true,如果該宏沒有被定義
#if 編譯時間條件下的測試,如果是true
#else #if 替代方案
#elif #else 和 #if 在一個語句
#endif 結(jié)束預(yù)處理條件
#error stderr上打印錯誤消息
#pragma 編譯器使用一個標準化的方法發(fā)出特殊命令

預(yù)處理器實例

分析下面的例子來了解各種指令。

#define MAX_ARRAY_LENGTH 20

該指令告訴OCPP,以取代實例MAX_ARRAY_LENGTH為20。使用#定義常數(shù),以增加可讀性。

#import <Foundation/Foundation.h>
#include "myheader.h"

這些的指令告訴OCPP得到 foundation.h 基礎(chǔ)框架和文本添加到當前源文件。下一行告訴 OCPP 從本地目錄得到 myheader.h 的內(nèi)容添加到當前源文件。

#undef  FILE_SIZE
#define FILE_SIZE 42

告訴OCPP 取消對現(xiàn)有 FILE_SIZE 的定義,并把它定義為42 。

#ifndef MESSAGE
   #define MESSAGE "You wish!"
#endif

這告訴OCPP定義消息,如果消息沒有被定義。

#ifdef DEBUG
   /* Your debugging statements here */
#endif

這告訴OCPP如果DEBUG被定義語句隨附過程。如果傳遞 DDEBUG標志,gcc編譯器在編譯時,這是非常有用的。這將定義DEBUG,所以可以在編譯過程中打開調(diào)試和關(guān)閉。

預(yù)定義宏

ANSI C定義了一些宏。雖然每一個都是供編程使用,預(yù)定義宏不應(yīng)該被直接修改。

Macro 描述
__DATE__ The current date as a character literal in "MMM DD YYYY" format
__TIME__ The current time as a character literal in "HH:MM:SS" format
__FILE__ This contains the current filename as a string literal.
__LINE__ This contains the current line number as a decimal constant.
__STDC__ Defined as 1 when the compiler complies with the ANSI standard.

讓我們試試下面的例子:

#import <Foundation/Foundation.h>

int main()
{
   NSLog(@"File :%s
", __FILE__ );
   NSLog(@"Date :%s
", __DATE__ );
   NSLog(@"Time :%s
", __TIME__ );
   NSLog(@"Line :%d
", __LINE__ );
   NSLog(@"ANSI :%d
", __STDC__ );
   
   return 0;
}

文件 main.m 上面的代碼在編譯和執(zhí)行時,它會產(chǎn)生以下結(jié)果:

2013-09-14 04:46:14.859 demo[20683] File :main.m
2013-09-14 04:46:14.859 demo[20683] Date :Sep 14 2013
2013-09-14 04:46:14.859 demo[20683] Time :04:46:14
2013-09-14 04:46:14.859 demo[20683] Line :8
2013-09-14 04:46:14.859 demo[20683] ANSI :1

預(yù)處理運算符

Objective-C 預(yù)處理器提供了運算符,以幫助創(chuàng)建宏:

宏延續(xù)()

宏通常必須包含在一個單一的行。宏延續(xù)運算符用于繼續(xù)宏的一行。例如:

#define  message_for(a, b)  
    NSLog(@#a " and " #b ": We love you!
")
Stringize (#)

stringize或數(shù)字符號運算符('#'),在宏定義內(nèi)使用時,一個宏參數(shù)轉(zhuǎn)換成一個字符串常量。此操作只可用于在宏具有指定參數(shù)或參數(shù)列表。例如:

#import <Foundation/Foundation.h>

#define  message_for(a, b)  
    NSLog(@#a " and " #b ": We love you!
")

int main(void)
{
   message_for(Carole, Debra);
   return 0;
}

讓我們編譯和運行上面的程序,這將產(chǎn)生以下結(jié)果:

2013-09-14 05:46:14.859 demo[20683] Carole and Debra: We love you!
標記粘貼 (##)

標記粘貼運算符(##)在宏定義內(nèi)結(jié)合兩個參數(shù)。在宏定義,允許兩個單獨的令牌必須合并成一個單一的令牌。例如:

#import <Foundation/Foundation.h>

#define tokenpaster(n) NSLog (@"token" #n " = %d", token##n)

int main(void)
{
   int token34 = 40;
   
   tokenpaster(34);
   return 0;
}

讓我們編譯和運行上面的程序,這將產(chǎn)生以下結(jié)果:

2013-09-14 05:48:14.859 demo[20683] token34 = 40

它是如何發(fā)生的,因為這個例子中的結(jié)果在下面從預(yù)處理的實際輸出:

NSLog (@"token34 = %d", token34);

這個例子顯示了串聯(lián)令牌#n為進token34,這里我們使用stringize和標記粘貼。

defined() 運算符

預(yù)處理器定義的常量表達式運算符用于確定是否使用#define定義一個標識符。如果指定的標識符被定義,該值是真(非零)。如果符號沒有定義,這個值是false(零)。定義的運算符規(guī)定如下:

#import <Foundation/Foundation.h>

#if !defined (MESSAGE)
   #define MESSAGE "You wish!"
#endif

int main(void)
{
   NSLog(@"Here is the message: %s
", MESSAGE);  
   return 0;
}

讓我們編譯和運行上面的程序,這將產(chǎn)生以下結(jié)果:

2013-09-14 05:48:19.859 demo[20683] Here is the message: You wish!

參數(shù)化宏

OCPP的一個強大功能是能夠模擬函數(shù),使用參數(shù)化宏。例如,我們可能有一些代碼方數(shù)字如下:

int square(int x) {
   return x * x;
}

我們可以重寫上面的代碼中使用宏如下:

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

帶參數(shù)的宏,必須使用才可以使用#define指令定義。參數(shù)列表括在括號中,必須緊跟在宏名。宏名和左括號之間不允許有空格。例如:

#import <Foundation/Foundation.h>

#define