我有一段代碼:C++編譯器力退出一些一段代碼
// some code, which only do sanity check
expensive checks
// sanity check end
現在我該怎樣告訴編譯器,迫使它退出 這一塊?基本上這意味着當我用-O2或 O3編譯時,我不希望它在那裏...
謝謝!
我有一段代碼:C++編譯器力退出一些一段代碼
// some code, which only do sanity check
expensive checks
// sanity check end
現在我該怎樣告訴編譯器,迫使它退出 這一塊?基本上這意味着當我用-O2或 O3編譯時,我不希望它在那裏...
謝謝!
而不是依賴於編譯器進行優化的代碼,你可以通過編譯器的附加符號定義,只有當你想要的代碼運行:
// some code, which only do sanity check
#ifdef my_symbol
expensive checks
#endif
// sanity check end
移動你的支票兌換成不同的功能,然後導入cassert並編寫assert(expensive_check())
。當您要禁用檢查時,請在之前使用#define NDEBUG
包含cassert。
您可以使用常量和單個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
}
}
在預處理器中使用宏和條件是真正避免編譯器生成代碼的唯一方法。
所以,這裏是我會怎麼做:
#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__
或獲取函數名稱)。
很明顯,assert()
宏將基本上做我的宏解決方案,除了它通常不提供文件名和行號。
那麼,有沒有更好的方法來做到這一點?我知道我可以通過一些國旗來控制這一點,但這真的不是我想要的 – WhatABeautifulWorld 2013-05-03 21:15:31
@WhatABeautifulWorld,你認爲什麼是「更好的方式」? – 2013-05-03 21:47:57
@WhatABeautifulWorld所以你期望編譯器讀取你的想法?顯然你必須指定一些東西來告訴編譯器它應該做什麼,並且在一個地方(makefile)這樣做似乎對我來說非常接近最優。 – Voo 2013-05-06 03:07:24