2011-05-12 68 views
1

我有記錄這個函數的指針的記錄宏,但問題是當記錄在靜態函數中使用的宏沒有這個指針時,我得到編譯錯誤。如何找到函數是否在編譯時是靜態的

e.g

LOG_DEBUG(msg,...) \ 
    Log::WriteLog(Log::LOG_DEBUG, __FILE__, __LINE__, _FUNC_NAME_, this, msg, ## __VA_ARGS__); 

我想知道是否有辦法來檢查,如果當前的方法是靜態的,比我既可以使用該指針或傳遞null,避免編譯錯誤。

請讓我知道,如果GNU提供任何預定義的宏來確定當前函數是靜態還是其他方式。

回答

2

我會避免嘗試自動檢測並使其成爲開發人員的責任。
只需提供另一個記錄宏,用於沒有此值的情況。
當您錯誤地使用LOG_DEBUG()並且您可以替換時,編譯器會生成一個錯誤。

LOG_NON_OO_DEBUG(msg,...) \ 
    Log::WriteLog(Log::LOG_DEBUG, __FILE__, __LINE__, _FUNC_NAME_, msg, ## __VA_ARGS__); 

注意:我不會傳遞NULL(或0)。
我會重載WriteLog()方法,以便它有一個不需要此指針的版本。

+0

thx爲答案。作爲一名優秀的懶惰程序員,我試圖避免宏的重複,並且基於方法的靜態或者非靜態代替現有的代碼。所以想想,如果在編譯時找到類似於boost靜態檢查的方法,那就太棒了。 – rjoshi 2011-05-12 19:56:12

0

添加到馬丁的回答,是一個編譯時間結構,而宏預處理器內,所以也沒有辦法來測試的這個存在與宏。在像perl這樣的較弱類型的語言中,可以檢查是否定義了一個符號,但是由於C/C++是強類型的,因此不需要這樣的運算符。

編輯

我想澄清一下,我試圖在上面的段落作位點。

預處理器是一個Cism。如果我不得不打賭,它可能只看到了錯誤修復和對其行爲的微小改變,但在其他方面與20年前的行爲幾乎完全相同。換句話說,預處理器的設計不適用於語言特定的功能。

語言功能,如靜態,調用約定,類型等...預處理器並不知道他們的,並且不具有邏輯與他們合作。如果語言功能存在來測試這個的定義,或者測試以查看您是否處於靜態函數中,唯一可以取消的方法是。

/編輯

我傾向於建議你用伐木非宏觀的角度,或者更少宏觀依賴的解決方案。我看到使用宏的唯一優點是您不必在整個地方輸入__FILE____LINE__。在這方面,我沒有看到任何你在宏中提出的問題。

例如,您可以添加一個泛型函數到類生成一個簡短的資料片,是這樣的:

class MyClass { 
    private: 
    void MemberLogMsg(); 
    public: 
    static void LogMsg(MyClass* M = NULL); 
}; 

您的宏將隨時調用LogMsg,和馬丁提出的責任將是對開發者是否通過這個或不。

現在,我不會忍受上述例子的質量,只能通過表達意思的精神。

+0

thx爲您的迴應。我確實使用boost-log,它處理大部分事情。它正在修改現有代碼,並根據靜態/非靜態修改宏,並對新開發人員進行培訓:) – rjoshi 2011-05-12 20:16:46

相關問題