簡體   English   中英

C++ 替代預處理器#ifdef / #endif

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

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