[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