C++ 定义NDEBUG时是否在函数内联之前删除断言?

C++ 定义NDEBUG时是否在函数内联之前删除断言?,c++,compilation,conditional-compilation,C++,Compilation,Conditional Compilation,对于上面的例子,我试图弄清楚increment方法是否真的是内联的。如果在我定义NDEBUG标志时编译器将删除断言,那么increment方法将变成一行,因此它实际内联的概率将增加。 因此,问题归结为编译器删除断言和做出内联决策的顺序 #ifndef Example_h__ #define Example_h__ #include <cassert> class A { private: int m_value = 0; public: void incremen

对于上面的例子,我试图弄清楚increment方法是否真的是内联的。如果在我定义NDEBUG标志时编译器将删除断言,那么increment方法将变成一行,因此它实际内联的概率将增加。 因此,问题归结为编译器删除断言和做出内联决策的顺序

#ifndef Example_h__
#define Example_h__
#include <cassert>

class A
{
private:
    int m_value = 0;

public:
    void increment();
};

inline void A::increment()
{
    ++m_value;
    assert(m_value < 100);
}

int main()
{
  A a;
  a.increment();
}

#endif
\ifndef示例__
#定义示例__
#包括
甲级
{
私人:
int m_值=0;
公众:
无效增量();
};
内联void A::increment()
{
++m_值;
断言(m_值<100);
}
int main()
{
A A;
a、 增量();
}
#恩迪夫

assert
是一个宏,因此它在编译器看到任何结果代码之前由预处理器处理。

是一个宏,因此它在实际编译(in)之前由正在发生的预处理器处理。是的,预处理器在编译器之前首先运行。但是,即使您没有使用预处理器实现assert,在做出内联决策之前,几乎总是会发生常量折叠,因此这种死代码仍然会被删除,如果合适的话,函数也会内联。通常,请相信编译器会做出内联决策。这种简单的代码永远不需要花费太多时间去担心。