你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> iOS開發深入了解宏定義#define

iOS開發深入了解宏定義#define

編輯:IOS開發綜合

關於宏定義相信大家一定不會陌生,我們經常使用的都是一些簡單的宏定義常量,或者使用宏定義一個方法。但是在項目中會使用到很多你真的理解宏定義的語法嗎?
下面來展示一些宏定義的用法:
1.使用宏定義定義一個常量

//This defines PI
#define M_PI        3.14159265358979323846264338327950288

2.使用宏定義定義一個func

//this define a MIN()
#define MIN(A,B) (A<B?A:B)

這些對大家來說可能都是很常見的,但是#define的高級用法在下面。
3.宏定義的嵌套

#define USER_GLOBAL(obj, userType)   _USER_CORE(obj, @#userType, nil)
#define _USER_CORE(obj, strType, strGroup)                      [AppUser apply:obj withUserType:strType withGroup:strGroup]

使用簡單的宏替代很長的方法,實現參數的傳遞
ps:@# 是字符化操作符,將傳入的單字符操作名轉化為字符

下面詳細解釋一下宏定義中的#、##、@#、\操作符的使用
“#”:字符串化操作符,作用是:將宏定義中的傳入參數名轉換成用一對雙引號括起來參數名字符串。使用條件:只能用於有傳入參數的宏定義中,且必須置於宏定義體中的參數名前
舉例:

#define example1(instr) #instr
string str=example1(abc); 將會展成:string str="abc";
注意:對空格的處理
a、忽略傳入參數名前面和後面的空格。
如:str=example1(   abc ); 將會被擴展成 str="abc";
b、當傳入參數名間存在空格時,編譯器將會自動連接各個子字符串,用每個子字符串中只以一個空格連接,忽略其中多余一個的空格。
如:str=exapme1( abc    def); 將會被擴展成 str="abc def";

“##”: 符號連接操作符,作用:將宏定義的多個形參名連接成一個實際參數名,使用條件:只能用於有傳入參數的宏定義中,且必須置於宏定義體中的參數名前

#define exampleNum(n) num##n
int num=exampleNum(9); 將會擴展成 int num=num9;
注意:
1、當用##連接形參時,##前後的空格可有可無。
如:#define exampleNum(n) num ## n 相當於 #define exampleNum(n) num##n
2、連接後的實際參數名,必須為實際存在的參數名或是編譯器已知的宏定義

@#:名稱:字符化操作符 作用:將傳入的單字符參數名轉換成字符,以一對單引用括起來。使用條件:只能用於有傳入參數的宏定義中,且必須置於宏定義體中的參數名前。

舉例:

#define makechar(x) @#X
a = makechar(b); 展開後變成了:a= 'b';

\ : 行繼續操作符 作用:當定義的宏不能用一行表達完整時,可以用”\”表示下一行繼續此宏的定義。注意:換行不能切斷單詞,只能在空格的地方進行。

3.使用宏定義定義方法

/** 添加一個函數聲明 */
#define _DEFINE_DATA_FUNC_INTERNAL(name, dataType)  \
                             -(void)set##name:(dataType)value; \
                             -(dataType)get##name; \
                             +(NSString *)key##name; \
                             -(BOOL)has##name;

4.使用宏定義定義方法實現

/** 添加一個函數定義 */
#define _IMPLEMENT_DATA_FUNC_INTERNAL(name, dataType, funForType, strKey) \
                -(void)set##name:(dataType)value { \
                [self set##funForType:value forKey:strKey]; \
                 } \
                -(dataType)get##name { \
                  return [self get##funForType:strKey]; \
                 } \
                +(NSString *)key##name { \
                  return strKey; \
                 }\
                -(BOOL)has##name {\
                  return [self hasKey:strKey]; \
                 }

5.使用宏定義創建單例類

#define GTMOBJECT_SINGLETON_BOILERPLATE(_object_name_, _shared_obj_name_)                                            \
__strong static _object_name_ *z##_shared_obj_name_ = nil;   \
+ (_object_name_ *)_shared_obj_name_ {                       \
    static dispatch_once_t pred = 0;                        \
    dispatch_once(&pred, ^{                                  \
        z##_shared_obj_name_ = [[self alloc] init];          \
    });                                                      \
    return z##_shared_obj_name_;                             \
}                                                            \
+ (id)allocWithZone:(NSZone *)zone {                         \
    @synchronized(self) {                                    \
        if (z##_shared_obj_name_ == nil) {                   \
            z##_shared_obj_name_ = [super allocWithZone:zone];\
        }                                                    \
    }                                                        \
    return z##_shared_obj_name_;                             \
}                                                            \
- (id)copyWithZone:(NSZone *)zone {                          \
    return self;                                             \
}                                                            \
+ (void)destroy##_object_name_ {                             \
}

參考鏈接:http://blog.csdn.net/zhubosa/article/details/51276652

以上就是IOS開發深入了解宏定義#define的全文介紹,希望對您學習和使用IOS應用開發有所幫助.[db:作者簡介][db:原文翻譯及解析]

【iOS開發深入了解宏定義#define】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved