[英]C++ alternative to pre-processor #ifdef / #endif
我有一個 StopWatch 類,用於測量執行時間。 我實例化了幾個不同的秒表以按類別記錄執行時間。 例如:
#ifdef EXEC_TIME_PROF
StopWatch func1sw;
StopWatch func2sw;
#endif
void foo() {
#ifdef EXEC_TIME_PROF
func1sw.start();
#endif
func1();
#ifdef EXEC_TIME_PROF
func1sw.stop();
func2sw.start();
#endif
func2();
#ifdef EXEC_TIME_PROF
func2sw.stop();
#endif
}
#ifdef EXEC_TIME_PROF
func1sw.logTime();
func2sw.logTime();
#endif
因此,實際的 2 行函數變得更長,而且所有的 #ifdef 語句都變得雜亂無章。 我使用 #ifdef 的原因是我不希望在非分析/生產版本中編譯語句。 有誰知道這樣做的更好方法嗎? 我的開發環境是 Windows/Visual Studio C++ 2015。
您可以使用宏在執行某些操作的類和根本不執行任何操作的類之間切換。 編譯器應該認識到這一點並將其排除在編譯之外。
#ifdef EXEC_TIME_PROF
// your actual implementation
class StopWatch
{
// ...
};
#else
// completely empty implementation
class StopWatch
{
public:
void start() {}
void stop() {}
void logTime() {}
};
#endif
如果你仍然想在生產中使用StopWatch
做其他事情,那么只需使用其他類似ProfilingStopWatch
東西,大致如下:
#ifdef EXEC_TIME_PROF
typedef StopWatch ProfilingStopWatch;
#else
// completely empty implementation
class ProfilingStopWatch
{
public:
void start() {}
void stop() {}
void logTime() {}
};
#endif
因此,如果不完全清楚,您可以從代碼中刪除其他宏測試並正常使用該類:
ProfilingStopWatch func1sw;
ProfilingStopWatch func2sw;
void foo()
{
func1sw.start();
func1();
func1sw.stop();
func2sw.start();
func2();
func2sw.stop();
}
func1sw.logTime();
func2sw.logTime();
只需添加一些額外的宏來包裝秒表,例如:
#define concat(a,b) a ## b
#ifdef EXEC_TIME_PROF
StopWatch func1sw;
StopWatch func2sw;
#define RUN_FUNC(funcName) \
concat(funcName,sw).start(); \
funcName(); \
concat(funcName,sw).stop();
#else
#define RUN_FUNC(funcName) \
funcName();
#endif
void foo() {
RUN_FUNC(func1);
RUN_FUNC(func2);
}
#ifdef EXEC_TIME_PROF
func1sw.logTime();
func2sw.logTime();
#endif
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.