C 預處理器語言注意點

2022-03-10 14:52:40 字數 1851 閱讀 8580

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...