2011-09-19 20 views
15

Durante una delle mie recenti discussioni con il mio manager, ha menzionato che uno dei suoi ex client utilizzava una macro C++ per registrare informazioni su ogni riga di codice. Tutto quello che dovevano fare era abilitare una variabile di ambiente prima di iniziare la corsa. (Naturalmente la variabile di ambiente è stata abilitata nella sola test-bedMacro C++ per registrare ogni riga di codice

Il registro menzionato le variabili utilizzate ei corrispondenti valori troppo Ad esempio, per la linea:..

a = a + b; 

Il registro direbbe qualcosa di simile:

"a = a + b; (a = 5 + 3)" 

Personalmente, non ero sicuro se questo era possibile, ma lui era molto sicuro di questo essere esistito, anche se non ricordava le specifiche del codice

.

Quindi, ecco la (ovvia) domanda: è possibile? Puoi fornire il codice per questo?

+0

Nella tua domanda, io sto avvolgendo le virgolette doppie per il messaggio di log (per dimostrare che si tratta di un messaggio di log). Spero sia ok. – iammilind

+0

Non esiste una macro C++, e questo certamente non è possibile con le macro di Pre-processor di vanilla C. Qualche altro strumento deve generare le stringhe di valore. – spraff

+1

Non penso sia possibile registrare righe nude come "a = a + b", ma è possibile utilizzare una macro nella riga come "LOG (a = a + b)" e asserire che le macro lo stanno già facendo. – Dialecticus

risposta

18

Non so se ogni riga/variabile può essere espansa in questo modo, ma è possibile registrare le chiamate di funzione. Ho registrato tutte le chiamate di funzione usando l'opzione -finstrument-functions di gcc. Si chiamerà:

void __cyg_profile_func_enter (void *this_fn, void *call_site); 

e

void __cyg_profile_func_exit (void *this_fn, void *call_site); 

per la funzione di entrare e uscire.

The docs explain how to use it. Non so se altri compilatori offrono qualcosa di simile.

+2

+1 per trovare interessanti – trojanfoe

+1

MSVC++ ha '/ Gh' e'/GH' per '_penter()' e le funzioni '_pexit()', che vengono chiamate rispettivamente all'inizio e alla fine di ogni funzione: http://msdn.microsoft.com/en-us/library/c63a9b7h.aspx –

0

È possibile verificare come BOOST_CHECKA from Boost.Test is implemented. Internamente utilizza modelli di espressione.

Per prova:

#define BOOST_TEST_MAIN 

#include <boost/test/included/unit_test.hpp> 
#include <boost/test/test_tools.hpp> 

BOOST_AUTO_TEST_CASE(test1) 
{ 
    int a=0; 
    int b=1; 
    int c=2; 
    BOOST_CHECKA(a+b == c); 
} 

uscita è:

Running 1 test case... 
main.cpp(11): error: in "test1": check a+b == c failed [0+1!=2] 

*** 1 failure detected in test suite "Master Test Suite" 

valori di nota tra parentesi quadre: [! 0 + 1 = 2]

ha alcune limitazioni.

Per prova:

BOOST_CHECKA((a+b) == c); 

output è:

check (a+b) == c failed [1!=2] 
Problemi correlati