// Example assert function
inline void assertImpl(bool mExpr, const std::string& mMsg) {
if(!mExpr) { printMsg(mMsg); abortExecution(); }
}
// Wrapper macro
#ifdef NDEBUG
#define MY_ASSERT(...) do{ ; }while(false)
#else
#define MY_ASSERT(...) assertImpl(__VA_ARGS__)
#endif
考慮一下mExpr
或mMsg
不是純表達式的情況 - 是否有辦法強制編譯器優化它們?空函數是否使用不純表達式進行優化?
bool globalState{false};
bool pureExpression() { return false; }
bool impureExpression() { globalState = !globalState; return false; }
// ...
// This will very likely be optimized out with (NDEBUG == 0)
MY_ASSERT(pureExpression());
// Will this be optimized out with (NDEBUG == 0)
MY_ASSERT(impureExpression());
- 什麼編譯器通常在不純的表述是「丟棄」的情況呢?
- 有沒有一種方法可以使100%的純表達式得到優化?
- 有沒有一種方法可以100%確定不純的表達式得到優化或永不優化?
當定義了'NDEBUG'時,'MY_ASSERT'不是一個表達式。如果你在表達式上下文中使用了'assert',就會導致問題,例如, C++ 11'constexpr'函數:'constexpr foo some_container :: operator [](int i)const {return(MY_ASSERT(i
Casey