Подтвердить что ты не робот

Только члены отладки

Есть ли хороший способ включить определенные члены только в отладочную сборку программы?

У меня есть индексированная структура данных, из которой я использую большое количество экземпляров, которые несут определенный флаг состояния в случае изменения некоторого содержимого структуры данных, но индекс не обновлен. Флаг состояния используется только для проверки того, что все использования индекса вызывают функциональность update, если данные были изменены, но по соображениям производительности и хранения, поскольку существует множество экземпляров, и структура данных может быть сильно изменена до вызова update, я хотел бы сохранить эти данные только для сборки отладки.

В этих флагах существуют два типа операций:

  • Установка/Сброс флага
  • assert что флаг не установлен, то есть некоторые части индекса все еще действительны.

Есть ли более приятные способы достижения этого, чем посыпать мой код операторами #ifndef NDEBUG?

Примечание. В моем специальном случае производительность может быть не такой большой, но я все еще ищу общий способ приблизиться к этому, поскольку, вероятно, для этой же идеи есть, вероятно, более сложные варианты использования.

4b9b3361

Ответ 1

Вы можете уменьшить количество #ifdefing, предоставив базовый класс средствам отладки:

class
t_MyDebugHelper
{
#ifdef NDEBUG
   public: void
   Set_Something(int value)
   {
       (void) value; // not used
   }

   public: void
   Verify_Something(void)
   {}
#else
   private: ::std::string m_some_info;
   private: int           m_some_value;

   public: void
   Set_Something(int value)
   {
       m_some_value = value;
   }   

   public: void
   Verify_Something(void)
   {
       // implementation
   }
#endif
};

class
t_MyClass
:   public t_MyDebugHelper
{
    public: void
    SomeMethod(void)    
    {
        t_MyDebugHelper::Verify_Something();
        t_MyDebugHelper::Set_Something(42);
        ...
    }
};

Этот метод не позволяет полностью избавиться от ifdef, однако он позволяет избежать их в логике основного кода. В Release build все вспомогательные функции отладки приведут к тому, что noop и t_MyDebugHelper класс не увеличит размер целевого класса из-за пустой оптимизации базового класса. Если помощник отладки нуждается в доступе к методам t_MyClass, тогда может быть применен CRTP.