// 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());
答案 0 :(得分:4)
宏扩展后,您对impureExpression()
的调用不再存在:它不是宏扩展结果的一部分。如果不存在对函数的调用,则只要定义NDEBUG
,就不会在所有符合要求的实现上,在任何优化级别调用该函数。
注意:您谈论的是NDEBUG == 0
,但如果这是您想要的条件,则#ifdef NDEBUG
条件不正确。 #ifdef
测试宏是否已定义,并且不关注定义是什么。
答案 1 :(得分:0)
此处不涉及优化程序。在使用NDEBUG
启用的宏中,无论如何都会丢弃参数。