巧用iOS巨集定義

2021-10-09 21:35:48 字數 2127 閱讀 4118

__attribute__((used,section...)) 把某個變數的放入特殊的section中

用法:char *kchinapyg __attribute((used, section("__data, chinapyg"))) = "chinapyg.com";

char *kdllhook __attribute((used, section("__data, dllhook"))) = "dllhook.com";

使用 used欄位,即使沒有任何引用,在release下也不會被優化

高階:巨集定義來實現上述過程

#define xx_export_module(module, impl) \

class nsobject; char * k##module __xx_module_data(xxmodule) = ""

#define __xx_module_data(xxmodule) __attribute((used, section("__data, "#xxmodule"")))

獲取檔名

#define _xx_file_ (strrchr(__file__, '/') ? strrchr(__file__, '/') + 1 : __file__)

獲取**行

__line__

__func__,__function__ ,__pretty_function__

描述gcc實現了如下的函式巨集

__func__ c99的標準,但是gcc只輸出函式名稱。

__function__ 同 __func__,

__pretty_function__ 非標準巨集。這個巨集比 __function__ 功能更強:

(1)若用 g++ 編譯 c++ 程式, __function__ 只能輸出類的成員函式名,不會輸出類名;而 __pretty_function__ 則會以 ::()的格式輸出成員函式的詳悉資訊(注: 只會輸出 parameters-list 的形參型別,而不會輸出形參名)。

(2) 若用 gcc 編譯 c 程式,__pretty_function__ 跟 __function__ 的功能相同.

__va_args__

描述c99 編譯器標準允許定義可變引數巨集(variadic macros),這樣就使用擁有可以變化的參數列的巨集。

#define fyflog(format, ...) nslog(format, __va_args__)

預設號代表乙個可以變化的參數列。使用保留名 '__va_args__' 把引數傳遞給巨集。當巨集的呼叫展開時,實際的引數就傳遞給 nslog() 了。

"##"

描述(1)在標準 c 裡,你不能省略可變引數,但是你卻可以給它傳遞乙個空的引數。gnu cpp 在這種情況下可以讓你完全的忽略可變引數。在上面的例子中,編譯器仍然會有問題( complain ),因為巨集展開後,裡面的字串後面會有個多餘的逗號。

為了解決這個問題, cpp 使用乙個特殊的『 ## 』操作。書寫格式為:

#define xxlog(format, ...) nslog(format, ##__va_args__)

這裡,如果可變引數被忽略或為空,『 ## 』操作將使預處理器( preprocessor )去除掉它前面的那個逗號。如果你在巨集呼叫時,確實提供了一些可變引數, gnu cpp 也會工作正常,它會把這些可變引數放到逗號的後面。

巨集定義再高階

#define __xx_concat(a, b) a ## b

#define xx_dynamic __attribute__((objc_dynamic))

#define xx_export_***x(something) \

xx_export_***x_remap(, something)

#define xx_export_***x_remap(name, something) \

_xx_export_***x_remap_internal(name, something, "__hello_key__")

#define _xx_export_***x_remap_internal(name, something, key) \

+ (nsarray *)__xx_concat(key, __line__) xx_dynamic

巧用巨集定義進行除錯

巧用巨集定義進行除錯 在進行程式設計時,有時我們往往不希望借住於除錯工具 如 gdb,vc 而以輸出除錯資訊的方式進行除錯時,我們就可以借住於強大的巨集定義來進行除錯。一 在gcc下的定義方法,因為gcc支援變引數的巨集定義,所以我們可以用如下定義 ifdef debug define dbg fo...

ios 巨集定義

這個不是ios 應該算是c裡面的 巨集定義巨集定義是c提供的三種預處理功能的其中一種,這三種預處理包括 巨集定義 檔案包含 條件編譯。1 編輯本段引數 不帶引數 巨集定義又稱為巨集代換 巨集替換,簡稱 巨集 格式 define識別符號字串 其中的識別符號就是所謂的符號常量,也稱為 巨集名 預處理 預...

小技巧 6 巧用巨集定義

大段的巨集定義可能會降低 的可讀性,但是適當使用巨集定義可以節省 量,讓 更加簡潔。比如對於定義有多種屬性的能力模組而言,這樣使用巨集定義會讓 更加清晰和簡潔 宣告一種屬性以及獲取該屬性值 define attr decl attr protected unsigned int attr 0 pub...