簡體   English   中英

在宏中定義然后取消定義預處理器變量

[英]Define then Undefine Preprocessor Variables within Macro

我想創建一個類似於以下的宏,該宏將用於創建兩個功能:一個啟用了調試功能,一個未啟用調試功能。

#define MakeDebuggerFunction(funName, funContents)\
    void funName() funContents\
    #define DEBUGGING\
    void funName ## _debugging() funContents\
    #undef DEBUGGING

它將被使用如下

MakeDebuggerFunction(DoWork,
    {
        std::cout << "Doing Work" << std::endl;
        #ifdef DEBUGGING
            std::cout << "Printing Verbose" << std::endl;
        #endif
    }
)

這將產生兩個函數:DoWork和DoWork_debugging。 兩個函數在該函數的代碼中具有完全相同的“內臟”,但是調試函數也將添加一些詳細的打印信息。

我要創建兩個功能的原因是因為我的GUI應用程序具有“開發人員模式”,當我不在辦公室或在客戶現場就可以使用它,而我卻沒有真正的調試環境。

其中許多功能的處理強度也很高,因此我想避免做一些類似的事情,例如添加永久的if(DeveloperMode) {}語句來包裝我的詳細代碼。

我能得到的任何幫助/建議將不勝感激。

我認為這就是@Justin的建議

我將使包裝函數如下所示:

void DoWork_Wrapper()
{
    if (DeveloperMode)
        DoWork(..., true);
    else
        DoWork(...., false);
}

並且worker函數將是:

void DoWork(..., bool DeveloperMode)
{
    /// do some stuff
    if (DeveloperMode)
        /// print verbose
}

因此,當我調用DoWork(..., false) ,編譯器已經優化了if語句?

這樣做怎么樣。 您可以使調試函數內聯,它將完全透明。 當然,您將必須處理更復雜的調試消息並適當調整調試功能。 這比復制功能要好得多。

void debug(string s) {
  if (DeveloperMode) {
    std::cout << s << "\n";
  }
}


 std::cout << "Doing Work" << std::endl;
 debug("Printing Verbose");

或者,您可以使用其中一種清除庫。 例如Log4c。

我不確定這是否正是您想要的,但是如果您可以在啟用調試的情況下編譯一個版本,而在不啟用調試的情況下編譯一個版本,只需在調試中添加一個DEBUGGING編譯標志,然后執行以下操作

#ifdef DEBUGGING
#define debugPrint(verboseMessage)            \
    std::cout << verboseMessage << std::endl;
#else
#define debugPrint(verboseMessage)
#endif

這樣可以使您始終可以調用此宏,並且如果已在其中進行調試,則實際上會打印您的消息,否則將不會發生任何事情。

HTH!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM