Si consideri il seguente codice:C++ funzione di chiamata identificativo
void Foo() {
......
LOG_ERROR("I'm error 1") // call 1
.....
LOG_ERROR("I'm error 2") // call 2
.....
}
LOG_ERROR()
è una macro. LOG_ERROR()
dovrebbe stampare la stringa identificandolo nel codice, mentre il presupposto è che il codice può cambiare, ma A::Foo()
rimarrà invariato. L'identificativo deve essere conservato mentre il codice cambia.
questo può essere risolto con l'aggiunta di codice di errore come argomento di LOG_ERROR()
, ma vogliamo rimuovere dal programmatore l'onere di gestire l'errore codici.
L'utilizzo di __LINE__
non è una risposta, poiché Foo()
può passare dalla build alla build .
Perciò ho pensato di identificare LOG_ERROR()
relativa dell'inizio della Foo()
:
- a. Identificare per nome file (
__FILE__
) + nome funzione (__FUNCTION__
) + numero di rigaLOG_ERROR()
relativo aFoo()
start. - b. Identificare per nome file (
__FILE__
) + nome funzione (__FUNCTION__
) +LOG_ERROR()
numero di chiamata inFoo()
.
La soluzione dovrebbe funzionare con VC++ 2008 e almeno g ++ 4.1.1.
Una soluzione proposta (link text) è:
#define ENABLE_LOG_ERROR static const int LOG_ERROR_start_line = __LINE__
#define LOG_ERROR(s) cerr << "error #" << (__LINE__ - LOG_ERROR_start_line) \
<< " in " << __func__ << ": " << s << endl
void Foo() {
ENABLE_LOG_ERROR;
//...
LOG_ERROR("error 1");
int i;
LOG_ERROR("error 2");
}
Questo impone all'utente di scrivere ENABLE_LOG_ERROR
in inizio di ogni funzione contenente LOG_ERROR()
e ci sei molti tali funzioni.
Esiste un altro modo per eseguire l'operazione?
@idimba, se non è troppo disturbo, è possibile utilizzare uno script per aggiungere automaticamente "ENABLE_LOG_ERROR;" subito dopo ogni nome di funzione. Io uso quel trucco quando esploro * codice di terze parti. –
Bella idea, ma influenzerà __LINE__ che usiamo ampiamente nel nostro sottosistema di registrazione. – dimba