C++ 如何在C++;例如C中的条件属性#

C++ 如何在C++;例如C中的条件属性#,c++,debugging,C++,Debugging,在C#中,可以创建如下方法: [Conditional("DEBUG")] private void MyFunction() { } 在发行版中,此方法将不再“存在” 使用C++,我有一个类,在每个方法的开头都想执行相同的断言,所以我想把断言组放在它们自己的方法中。如果我选择这样做,我是否必须依赖编译器优化空函数(因为断言也将优化)?例如: class MyClass { private: void DebugFunction() { assert(...);

在C#中,可以创建如下方法:

[Conditional("DEBUG")]
private void MyFunction()
{
}
在发行版中,此方法将不再“存在”

使用C++,我有一个类,在每个方法的开头都想执行相同的断言,所以我想把断言组放在它们自己的方法中。如果我选择这样做,我是否必须依赖编译器优化空函数(因为断言也将优化)?例如:

class MyClass
{
private:
   void DebugFunction()
   {
       assert(...);
       assert(...);
       assert(...);
       // ...
   }
};
class MyClass
{
private:
    void CheckState()
    {
        assert(...); 
        assert(...);

#ifndef NDEBUG
        // some expensive check to only run on Debug builds
#endif

        // Some check you want to always make
   }
}
或者我需要引入一个宏:

#ifdef NDEBUG
#define DebugFunction
#endif

最好的方法是什么?

编译器肯定会优化空函数。与调试和发布的不同版本的代码相比,我更喜欢断言的功能。当然,您应该适当地命名函数,并记录您的原因:-)

如果出于某种原因,您确实有使用
#ifndef
的冲动,请确保在
CheckState()函数中执行此操作。这也允许您在发布模式下执行检查,如果您以后决定这样做的话。例如:

class MyClass
{
private:
   void DebugFunction()
   {
       assert(...);
       assert(...);
       assert(...);
       // ...
   }
};
class MyClass
{
private:
    void CheckState()
    {
        assert(...); 
        assert(...);

#ifndef NDEBUG
        // some expensive check to only run on Debug builds
#endif

        // Some check you want to always make
   }
}

编译器肯定会优化空函数。与调试和发布的不同版本的代码相比,我更喜欢断言的功能。当然,您应该适当地命名函数,并记录您的原因:-)

如果出于某种原因,您确实有使用
#ifndef
的冲动,请确保在
CheckState()函数中执行此操作。这也允许您在发布模式下执行检查,如果您以后决定这样做的话。例如:

class MyClass
{
private:
   void DebugFunction()
   {
       assert(...);
       assert(...);
       assert(...);
       // ...
   }
};
class MyClass
{
private:
    void CheckState()
    {
        assert(...); 
        assert(...);

#ifndef NDEBUG
        // some expensive check to only run on Debug builds
#endif

        // Some check you want to always make
   }
}
我相信你想要那里…我相信你想要那里。。。