Digamos que eu quero ter vários tipos de mensagens de saída no meu código. Um deles é DEBUG
, que é impresso apenas, quando o código é compilado no modo de Depuração.
Normalmente eu teria que escrever algo como
#ifdef DEBUG
std::cout << "Debug message" << std::endl;
#endif
o que é bastante complicado e chato de usar em muitos lugares.
É uma boa prática definir uma macro para o snippet de código, para que você a use dessa maneira?
MSG_DEBUG("Debug message")
Ou existe outra maneira mais elegante de lidar com isso sem macros? Estou interessado em possíveis soluções em C e C ++, pois estou usando as duas linguagens em diferentes projetos.
constexpr if
em C ++, por exemplo.STDERR
. Além disso, por que não fazê-lo dependerNDEBUG
como emassert()
vez disso? Então você pode definir como#define DEBUG_MSG(MSG) assert(std::cerr << MSG)
, que também testa o estado do fluxo.Respostas:
Claro, se você está bem em usar macros em primeiro lugar, definir um parametrizado em vez de continuar repetindo o mesmo código condicional é certamente preferível a qualquer medida de boa codificação.
Você deve usar macros? Na minha opinião, você deveria, já que é uma prática aceita em C, e qualquer solução sem macro exigiria que pelo menos algo fosse executado mesmo fora do modo de depuração. O programador C típico seleciona uma macro um pouco feia com esforço desnecessário em tempo de execução a qualquer momento.
fonte
Há um elemento de preferência pessoal aqui, mas em C ++ eu prefiro fazer isso no arquivo de cabeçalho:
Para que a função seja destacada nas compilações de versão, mas seja uma função adequada na compilação de depuração para que você possa ter uma verificação de tipo adequada, mensagens de erro sensatas etc. e a capacidade de adicionar mais funcionalidades (log, talvez?) Posteriormente.
Obviamente, você também precisa incluir a definição correspondente da função no
.cpp
arquivo em um#ifdef _DEBUG
bloco.fonte
Definitivamente, verifique se você não está seguindo as diretrizes de código fornecidas por sua equipe. Certifique-se de que nenhum outro código no sistema tente alcançar a mesma funcionalidade por meio de uma condição geral.
fonte