OC 30 day
因為在study的時候,看到這一段code,所以紀錄一下,不過預處理跟OC的語法不是很有關連,各位就見諒啦。
預處理就是在進行編譯的第一遍詞法掃描和語法分析之前所作的工作。說白了,就是對源文件進行編譯前,先對預處理部分進行處理,然後對處理後的代碼進行編譯。
經過處理後的代碼,將會變的很精短。
基礎的常用語法,接下來我們會利用這些語法做很多運用。
#define //定義一個預先宏
#undef //取消宏的定義
#if //編譯初步中的條件命令,相當於C語法中的if語句
#ifdef //判斷某個宏是否被定義(#define過),若已定義,執行後續的語句
#ifndef //與#ifdef相反,判斷某些宏是否正確定義
#elif //若#if,#ifdef,#ifndef或前面的#elif條件不滿足,則執行#elif之後的語句,相當於C語法中的else-if
#else //與#if,#ifdef,#ifndef對應,若這些條件不滿足,則執行#else之後的語句,相當於C語法中的else
#endif //#if,#ifdef,#ifndef這些條件命令的結束標誌。
#defined //與#if,#elif配合使用,判斷某些宏是否被定義
#pragma //說明編譯器信息
#warning //顯示編譯警告信息
#error //顯示編譯錯誤信息
在實務上,常常需要對開發和正式環境設定不同的參數,比方 API 的 URL、需不需要印 Log 等等。雖然說,這些事情可以手動調整,但是人非聖賢,難免會有失手的時侯。透過 Xcode 的 Macros(巨集)、Custom Flags 的定義,可以輕鬆幫我們避免諸如此類的問題發生。
1.在 "Target > Build Settings > Preprocessor Macros > Debug" 設置"DEBUG=1”。
2.之后在pch或工具類中就可以這麼寫了:
#ifdef DEBUG
(debug 模式下的配置)
#else
(release 模式下的配置)
#endif
#ifdef DEBUG //調試狀態,:LOG功能
#define SFString [NSString stringWithFormat:@“%s”,__FILE __]。lastPathComponent
//打印出所在文件名,所在行,可選地址
#define SFLog(...)printf(“%s:%p(line =%d):%s \ n \ n”,[SFString UTF8String],&self,__LINE__,[[NSString stringWithFormat:__ VA_ARGS__] UTF8String]) ;
//#else
//#define SFLog(s, ...) NSLog(@"<%@: %p (line = %d)> %@", self.class, self, __LINE__,[NSString stringWithFormat:(s),##__VA_ARGS__])
//#endif
#else // 发布状态, 关闭LOG功能
#define SFLog(s, ...)
#endif
系统宏介绍:
__LINE__:宏在预编译时会替换成当前的行号
__FUNCTION__:宏在预编译时会替换成当前的函数名称
__VA_ARGS__:简单的说,就是将左边…的内容替换进来