Objective c NSLog 的巨集定義

2021-06-22 14:59:32 字數 1564 閱讀 5691

__va_args__ 是乙個可變引數的巨集,這個可變引數的巨集是新的c99規範中新增的,目前似乎只有gcc支援(vc6.0的編譯器不支援)。巨集前面加上##的作用在於,當可變引數的個數為0時,這裡的##起到把前面多餘的","去掉,否則會編譯出錯。
2) __file__ 巨集在預編譯時會替換成當前的源檔名
3) __line__巨集在預編譯時會替換成當前的行號
4) __function__巨集在預編譯時會替換成當前的函式名稱

objective-c nslog 的巨集定義

相信所有的iphone開發者都曾經或者將會用到nslog這個函式。nslog的強大之處在於,它能在**執行過程中顯示變數值以及程式實際走向,能幫助我們發現大量錯誤和潛在風險。我們希望盡可能多的用到nslog,希望它能無處不在,使得錯誤無法存在——簡單的說nslog是乙個天使。

比如下面這段**就利用nslog,在程式執行時判斷裝置種類並顯示出來

nsstring *devicetype = [uidevice currentdevice].model;

nslog(@」device type: %@.」, devicetype);

使用nslog的乙個風險是:它的執行會占用時間和裝置資源。當我們用simulator時,nslog的資源占用並不引人注意,風險也不會顯示出來。但是如果你寫的是乙個即時戰略遊戲,而你在每乙個action中都加入了nslog——那麼nslog將成為乙個魔鬼。災難的具體表現常常是:你在 simulator中執行遊戲暢通無阻,但到了真機上,會發現很「卡」,不論是拖動乙個單位還是縮放乙個場景,fps也降到了各位數。

簡單而粗暴的解決方案是:在乙個遊戲release前,將所有的nslog注釋掉。簡單有效,但***是:下次你要除錯時,又得將nslog乙個個取消注釋。

我找到了乙個最為有效的解決方案:你以release模式編譯的程式不會用nslog輸出,而你以debug模式編譯的程式將執行nslog的全部功能。

#ifndef __optimize__

# define nslog(…) nslog(__va_args__)

#else

# define nslog(…) {}

#endif

這個**的魔術在於:release模式通常會定義 __optimize__,當然debug模式不會。將這段**放在你的標頭檔案當中,你就可以放心的使用nslog了!

當然還有其他的方式,比如:

1.直接自己寫#define,當release版本的時候把#define 注釋掉即可

1.#define ios_debug

2.#ifdef ios_debug  

3.#define nslog(...) nslog(__va_args__)  

4.#endif  2.

1.#ifdef debug    

2.# define dlog(format, ...) nslog((@"[檔名:%s]" "[函式名:%s]" "[行號:%d]" format), __file__, __function__, __line__, ##__va_args__);    

3.#else    

4.# define dlog(...);    

5.#endif 

核心中likely和unlikely巨集定義

在核心 中經常會看到unlikely和likely的蹤影。他們實際上是定義在 linux compiler.h 中的兩個巨集。define likely x builtin expect x 1 define unlikely x builtin expect x 0 這裡的 built expec...

CDEFINES用於定義C語言使用的巨集定義

cdefines用於定義c語言使用的巨集定義 系統定義的環境變數是沒法在c語言和組合語言中起作用的,如果非要這樣做 可以按照以下的步驟 1 在bsp根目錄中修改 bat 檔案,add set is lcd 240x320 1 2 在bsp根目錄中修改sources.cmn 檔案,add if is ...

Win Unix Mac 等多種系統平台的巨集定義

分享一下我老師大神的人工智慧教程。零基礎!通俗易懂!風趣幽默!還帶黃段子!希望你也加入到我們人工智慧的隊伍中來!最近正在學習c 程式從 windows 平台向 unix 平台移植,參考了 qt 的巨集定義檔案 win unix mac 等多種系統平台的巨集定義,平台移植時可做參考 拓展參考 qglo...