2014-01-15 71 views
1

這不是我試圖創建宏,但這個比喻試圖創建一個自定義的日誌記錄功能,在的OBJ-C和C環境工作的說明了這一點:ObjC宏 - 我可以包含檢查是否在當前範圍內定義了一個變量嗎?

#define Log(_s, ...) do { \ 


/* obviously this won't work as written, */\ 
/* but it's what i'm trying to accomplish: */\ 

#if (self && _cmd) /* \ 
    LogObjectiveC(_s, ##__VA_ARGS__); \ 
#else \ 
    LogC(_s, ##__VA_ARGS__); \ 
#endif \ 
} while (0) 

在這個例子中,我們正在嘗試合併兩個取決於它們被定義的位置的宏。 (LogObjectiveC用於當一個OBJ-C方法內,並且LogC使用C函數內部時。

是它的宏定義內的「隱藏」參數(self_cmd)的存在可能檢查?

回答

3

這是不可能的,因爲在宏展開時不存在的方法,功能和參數。宏是由編譯器做任何事情與您的代碼之前,預處理器擴展。

最接近的事我能想到的將在運行時檢查__func__並查看它是以「+ [」還是「 - [」開頭,因爲所有Objective- C方法從其中一個開始,並且沒有合法的C或C++函數可以。

+1

但是,即使你檢查是否'__func__'與'+'或開始(實際上沿@行Chuck的建議去) ' - [',你不能有條件地檢查'cmd'的值 - 如果該變量不在範圍內,你仍然會得到一個語法錯誤。 –

0

我在標記查克的正確答案,謝謝你的回答。

15分鐘谷歌搜索後,我無意中發現了這個重複的問題:Conditional macro expansion

相關問題