簡體   English   中英

C ++強制編譯器選擇退出某些代碼

[英]c++ force compiler to opt out some piece of code

我有一段代碼:

// some code, which only do sanity check
expensive checks
// sanity check end

現在,我如何告訴編譯器強制其選擇退出? 基本上,這意味着當我使用-O2或O3進行編譯時,我不希望它在那里。

謝謝!

您可以使用一個常數和一個if / def對來完成此操作。 這樣,仍可以編譯代碼並檢查錯誤,但在優化過程中將其省略。 這樣可以防止可能會破壞校驗碼的更改無法被檢測到。

#if defined(USE_EXPENSIVE_CHECKS) || defined(DEBUG)
#define USE_EXPENSIVE_CHECKS_VALUE true
#else
#define USE_EXPENSIVE_CHECKS_VALUE false
#endif

namespace {
 const bool useExpensiveChecks = USE_EXPENSIVE_CHECKS_VALUE;
};

void function()
{
    if(useExpensiveChecks == true)
    {
        // expensive checks
    }
}

不必依賴編譯器優化代碼,而僅在希望代碼運行時才可以向編譯器傳遞附加的符號定義:

// some code, which only do sanity check
#ifdef my_symbol
expensive checks
#endif
// sanity check end

在預處理器中使用宏和條件實際上是避免編譯器生成代碼的唯一方法。

因此,這是我的處理方式:

#ifdef NEED_EXPENSIVE_CHECKS
inline expensive_checking(params...)
{
   ... do expensive checking here ... 
}
#else
inline expensive_checking(params...)
{
}
#endif

然后只需致電:

some code
expensive_checking(some_parameters...)
some other code

空的內聯函數將在任何體面的現代編譯器中導致“無代碼”。 在調試版本設置中使用-DNEED_EXPENSIVE_CHECKS ,不要在發行版本中使用它。

我也知道結合使用宏和函數,例如:

#ifdef NEED_EXPENSIVE_CHECKS
#define EXPENSIVE_CHECKS(stuff...) expensive_checks(__FILE__, __LINE__, stuff...)
inline expensive_checks(const char *file, int line, stuff ...)
{
   if (some_checking)
   {
      cerr << "Error, some_checking failed at " << file << ":" << line << endl;
   }
}
#else
#define EXPENSIVE_CHECKS(stuff...)
#endif

現在,您可以獲得有關什么文件和什么行失敗的信息,如果在很多地方進行了檢查,這將非常有用(如果需要,您也可以使用__function____pretty_function__來獲取函數名稱)。

顯然, assert()宏實際上會執行我的宏解決方案,除非它通常不提供文件名和行號。

將您的支票移到其他函數中,然后導入cassert並寫入assert(expensive_check()) 如果要禁用檢查,請裝入cassert 之前使用#define NDEBUG

暫無
暫無

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

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