как сделать инициализацию std :: array, используемую в режиме отладки, игнорируемой в модели релиза? - PullRequest
0 голосов
/ 15 октября 2018

У меня есть макрос , называемый DEVLOGGER, и DEVLOGARRAYMSG.
DEVLOGGER отвечает за вызов одноэлементной функции, которая регистрирует переданное сообщение.

DEVLOGARRAYMSG вызывает одноэлементную функцию, которая получает std::array и создает сообщение.это сообщение затем передается DEVLOGGER для ведения журнала.

Причина, по которой у меня есть эти макросы , заключается в том, что ведение журнала происходит только в режиме отладки.Когда исходный код компилируется в режиме выпуска, они игнорируются.

#if _DEBUG
#undef DEVLOGGER
#define DEVLOGGER(message)   {            \
      DevLogger::Get().Log(message);}
#undef DEVLOGARRAYMSG
#define DEVLOGARRAYMSG(arr) {                  \
      DEVLOGGER(DevLogger::Get().CreateReelPosMsg(arr));}

#else
#undef DEVLOGGER
#define DEVLOGGER
#undef DEVLOGARRAYMSG
#define DEVLOGARRAYMSG
#endif /*_DEBUG*/

Однако, вот моя проблема.рассмотрите этот пример,

 std::array<int, (size_t)REEL_MAX> arr1 = { 1,2,3,4,5};
 DEVLOGARRAYMSG(arr1);

Когда я запускаю это в режиме выпуска, массив std будет создан, даже если вызов DEVLOGARRAYMSG игнорируется компилятором во время компиляции.

Iможет использовать #if#endif охранников;

#if _DEBUG
     std::array<int, (size_t)REEL_MAX> arr1 = { 1,2,3,4,5};
     DEVLOGARRAYMSG(arr1)
#endif

Но я не очень заинтересован в этом методе, потому что всегда есть возможность #, если # endif охранники могут быть случайно неуместны / забыты/ удалено во время разработки

Если бы я мог сделать что-то вроде:

DEVLOGARRAYMSG({1,2,3,4,5});

Это было бы здорово, но, насколько я знаю, это недопустимо.Я хотел бы знать, как вы, ребята, справляетесь с такими проблемами

...