[英]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.