c 預處理器語言注意點
**ios 中用到的預處理器語言: **
標頭檔案常規注意點:
#import 相對於 #include 而言,可以確保標頭檔案僅在原始檔中被包含一次(防止遞迴包含)。
診斷常規使用:
例子說明:free 是在 debug 下定義的巨集,沒有在 release 下定義。#warning 警告 debug 下定義了 free , #error 在 release 下判斷是否定義了 free 。
巨集定義常規注意點:
定義帶參巨集語法:
一般帶參巨集:
#define chmax(a,b) a>b ? a : b
使用 # 帶參巨集:
# 用於把巨集定義中的引數變為 c 字串(#@ 用於將引數變為 c 字元)
#define chstr(str) #str
nslog(@"%s",chstr(123)); -> nslog(@"%s","123");
使用 ## 帶參巨集:
相當於乙個連線符號
#define chname(name) [self imock_##name]
[self chname(log)]; -> [self imock_log]
使用可變引數巨集 _va_args_ :
如果我們想對列印語句進行條件編譯,不使用__va_args__
你會發現我們要寫兩個列印語句(nslog() 引數可變):
#define chlog1(x) nslog(x)
#define chlog2(a , b) nslog(a , b)
我們使用可變引數巨集(可以簡單的理解為用 ... 替換__va_args__
):
#define chlog3(...) nslog(__va_args__)
還可以使用(如果可變引數傳空,## 會幫你把實際呼叫語句中用於引數分隔的逗號去掉):
#define chlog4(a , ...) nslog(a , ##__va_args__)
推薦的除錯列印寫法(個人喜好):
#ifdef debug
#define chlog(fmt, ...) nslog((@"\nfunc: %s ---- [line %d] \n" fmt),__func__, __line__, ##__va_args__)
#else
#define chlog(fmt, ...)
#endif
#pragma特殊使用:
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-wunused-variable"
int a;
#pragma clang diagnostic pop
例子說明:我們申明乙個未使用變數 a ,這時候編譯器會給出乙個警告(unused variable 'a')。我們可以使用上述命令來過濾掉這條不必要的警告。 ignored 後引數格式:-w 加上所報警告。
感謝:
c 語言三種預處理功能
clang compiler user's manual
c語言 ##va_args巨集
C語言 預處理器
如果想在下一行延續指令,則在當前行末尾使用 字元 帶引數的巨集 define max x,y x y x y define is even n n 2 0 則i max j k,m n if is even i i 將被替換為 i j k m n j k m n if i 2 0 i 巨集的替換列表...
C語言 預處理器
指令 描述 define 定義巨集 macro include 包含乙個源 檔案 undef 取消已定義的巨集 ifdef 如果巨集已經定義,則返回真 ifndef 如果巨集沒有定義,則返回真 if如果給定條件為真,則編譯下面 else if 的替代方案 endif 結束乙個if.else條件編譯塊...
C語言 預處理器
6 gcc編譯器檢視替換後的編碼 7 標頭檔案相互包含導致的重定義錯誤 指令 描述 define 定義巨集 include 包含乙個源 檔案 undef 取消已定義的巨集 ifdef 如果巨集已經定義,則返回真 ifndef 如果巨集沒有定義,則返回真 if如果給定條件為真,則編譯下面 else i...