Presumindo que o seu compilador C ++ apoia-los, há alguma razão em particular não para uso __FILE__
, __LINE__
e __FUNCTION__
para fins de depuração registro e?
Estou preocupado principalmente em fornecer ao usuário dados enganosos - por exemplo, relatar o número ou a função da linha incorreta como resultado da otimização - ou sofrer um impacto no desempenho como resultado.
Basicamente, eu posso confiar __FILE__
, __LINE__
e __FUNCTION__
para sempre fazer a coisa certa?
c++
debugging
logging
c-preprocessor
Runcible
fonte
fonte
Respostas:
__FUNCTION__
não é padrão,__func__
existe no C99 / C ++ 11. Os outros (__LINE__
e__FILE__
) estão bem.Ele sempre reportará o arquivo e a linha corretos (e funcionará se você optar por usar
__FUNCTION__
/__func__
). A otimização não é um fator, pois é uma expansão da macro de tempo de compilação; isso nunca afetará o desempenho de nenhuma maneira.fonte
__func__
é meio que um problema em C ++. C99 não diz uma palavra sobre argumentos padrão e assim por diante, casos em que não é tão óbvio como__func__
deve se comportar em C ++.__func__
existe em c99, não em c ++. Independentemente disso, acho que uma implementação razoável do__func__
c ++ resultaria apenas no nome mutilado. Como não sou escritor de compiladores, essa não é minha decisão.__FUNCTION__
? Quais compiladores, exceto o recente gcc, tratam isso como uma variável, não como uma macro?__func__
agora está no padrão C ++ 11.Em casos raros, pode ser útil alterar a linha fornecida por
__LINE__
outra coisa. Eu já vi o GNU configurar fazer isso para que alguns testes relatem números de linhas apropriados após a inserção de um vodu entre linhas que não aparecem nos arquivos originais. Por exemplo:Inicia as linhas a seguir com
__LINE__
100. Como opção, você pode adicionar um novo nome de arquivoIsso raramente é útil. Mas se for necessário, não há alternativas que conheço. Na verdade, em vez da linha, uma macro também pode ser usada, o que deve resultar em qualquer uma das duas formas acima. Usando a biblioteca de pré-processador boost, você pode incrementar a linha atual em 50:
Eu pensei que era útil mencioná-lo, uma vez que você perguntou sobre o uso de
__LINE__
e__FILE__
. Nunca se obtém surpresas suficientes em C ++ :)Edit: @ Jonathan Leffler fornece mais alguns casos de uso bons nos comentários:
fonte
FYI: g ++ oferece a macro __PRETTY_FUNCTION__ não padrão. Até agora eu não sabia sobre o C99 __func__ (obrigado Evan!). Acho que ainda prefiro __PRETTY_FUNCTION__ quando estiver disponível para o escopo de classe extra.
PS:
fonte
Pessoalmente, estou relutante em usá-los para qualquer coisa, exceto mensagens de depuração. Eu fiz isso, mas tento não mostrar esse tipo de informação aos clientes ou usuários finais. Meus clientes não são engenheiros e, às vezes, não são conhecedores de computadores. Posso registrar essas informações no console, mas, como disse, com relutância, exceto pelas compilações de depuração ou por ferramentas internas. Suponho que isso dependa da base de clientes que você possui.
fonte
C ++ 20
std::source_location
O C ++ finalmente adicionou uma opção não macro e provavelmente dominará em algum momento no futuro quando o C ++ 20 se espalhar:
A documentação diz:
onde NTBS significa "Cadeia de bytes nulos terminados".
Vou tentar quando o suporte chegar ao GCC, o GCC 9.1.0 com
g++-9 -std=c++2a
ainda não o suporta.https://en.cppreference.com/w/cpp/utility/source_location afirma que o uso será como:
Saída possível:
__PRETTY_FUNCTION__
vs__FUNCTION__
vs__func__
vsstd::source_location::function_name
Respondida em: Qual é a diferença entre __PRETTY_FUNCTION__, __FUNCTION__, __func__?
fonte
<experimental/source_location>
no atual gcc-9.Eu os uso o tempo todo. A única coisa com que me preocupo é ceder o IP nos arquivos de log. Se os nomes das suas funções forem realmente bons, você poderá facilitar a descoberta de um segredo comercial. É como enviar com símbolos de depuração, mas é mais difícil encontrar coisas. Em 99,999% dos casos, nada de ruim resultará disso.
fonte
strings
utilitário para extrair todos os dados semelhantes a cadeias de caracteres do executável. Até os executáveis compactados podem ser extraídos. Esteja atento ao que você envia para o site de um cliente. Muitas vezes, os concorrentes conseguem colocar as mãos em seus executáveis, mesmo que não devam fazê-lo.