[so] [Tech Q] Print debugging

Razvan Deaconescu razvan.deaconescu at cs.pub.ro
Sun Mar 6 23:35:00 EET 2011


On 03/06/2011 10:55 PM, Adrian Scoica wrote:
>>
>> 1) Când faci debugging, vrei să nu afișezi doar un mesaj ci, de dorit,
>> fișierul și linia care a generat mesajul.
> 
> Pentru linia curenta din fisier, se poate folosi macro-ul __LINE__
> (cate 2 caractere '_'). __LINE__ functioneaza fie in mod absolut
> (numarand de la inceputul fisierului), fie in mod relativ (numara
> incremental de la ultima directiva #line din fisier). De exemplu:
> 
> /* asta e linia 4 */
> printf("%d",__LINE__); /* se afiseaza 5 */
> #line 100
> printf("%d",__LINE__); /* se afiseaza 100 */

și __FILE___ pentru fișier. Astfel, o formă bună de print debugging devine:

---
#ifdef DEBUG_
#define LOG(a)               \
        fprintf(stderr, "%s [%d]: %s\n", __FILE__, __LINE__, a)   \
#else
#define LOG(a)               \
        do { } while (0)     \
#endif
---

Din păcate, presupune că a este șir ceea ce poate nu este cazul, poate
îmi doresc să afișez un mesaj mai complex, ca mai jos.

>> 2) Nu vrei să afișezi doar un string ci poate o afișare de forma printf.
>> Adică LOG("x = %d, y = %d\n", x, y);
> 
> In C++, poti afisa o variabila intr-un macro doar stiindu-i numele. De
> exemplu, daca ai:
> 
> #define LOG(a) (std::cerr<< a << "\n")
> 
> atunci poti afisa astfel:
> 
> LOG("valoare(x): " << x << ", valoare(y) " << y);

Nu mă pricep la C++ așa că te voi crede pe cuvânt că se poate :-)

> Exista si in C o metoda mai generica? :-?

Da, există. Folosind Variadic Macros[1][2]. Cine vine cu o propunere
care să includă Variadic Macros?

Răzvan

[1] http://en.wikipedia.org/wiki/Variadic_macro
[2] http://gcc.gnu.org/onlinedocs/cpp/Variadic-Macros.html


More information about the so mailing list