Допустим, я хочу, чтобы в моем коде было несколько типов выходных сообщений. Один из них DEBUG
, который печатается, только когда код скомпилирован в режиме отладки.
Обычно я должен был написать что-то вроде
#ifdef DEBUG
std::cout << "Debug message" << std::endl;
#endif
что довольно громоздко и раздражает во многих местах.
Является ли хорошей практикой определение макроса для фрагмента кода, чтобы вы использовали его таким образом?
MSG_DEBUG("Debug message")
Или есть какой-нибудь другой, более изящный способ, как справиться с этим без макросов? Меня интересуют возможные решения как на C, так и на C ++, так как я использую оба языка в разных проектах.
constexpr if
C ++, например.STDERR
. Кроме того, почему бы не заставить его зависеть от того,NDEBUG
чтоassert()
делает вместо этого? Затем вы можете определить его как#define DEBUG_MSG(MSG) assert(std::cerr << MSG)
, который также проверяет состояние потока.Ответы:
Конечно, если вы в первую очередь согласны с использованием макросов, то любой параметр хорошего кодирования, безусловно, предпочтительнее определить параметризованный, а не повторять один и тот же условный код.
Вы должны использовать макросы вообще? На мой взгляд, вам следует, так как это принято в C, и любое решение без макросов потребует выполнения хотя бы чего- то даже вне режима отладки. Типичный C-программист в любой момент выберет немного уродливый макрос вместо ненужных усилий во время выполнения.
источник
Здесь есть элемент личных предпочтений, но в C ++ я предпочитаю делать это в заголовочном файле:
Таким образом, эта функция встроена в сборку релиза, но является правильной функцией в сборке отладки, поэтому вы можете иметь надлежащую проверку типов, заметные сообщения об ошибках и т. Д., А также возможность добавлять дополнительные функции (возможно, в журнал?).
Очевидно, вам также необходимо заключить соответствующее определение функции в
.cpp
файл в#ifdef _DEBUG
блок.источник
Определенно, просто убедитесь, что вы не наступаете на правила, изложенные вашей командой. Убедитесь, что никакой другой код в системе не пытается достичь той же функциональности через общее условие if.
источник