Eu de obicei folosesc:<br><br>#define DEBUG 1<br>#define log         if( DEBUG == 1 )<br><br>și pentru a afișa informație de debug:<br><br>log printf( &quot;orice sintaxă suportată de printf, cu sau fără __LINE__ sau alte &#39;magical constants&#39; &quot; );<br>
<br>sau pentru afișări complexe (exemplu o matrice):<br><br>log {<br> for i ...<br>  for j ..<br>   printf ...<br>printf ...<br>...<br>...<br>...<br>}<br><br>Are 2 probleme:<br><br>1. Într-adevăr adaugă un jump la fiecare if.<br>
2. Trebuie avut grijă la folosirea sintaxei:<br>      if( test == 1 )<br>           log printf( &quot;Testul e 1&quot;);<br>      else<br>           log printf( &quot;Testul nu e 1&quot; );<br>   &quot;else&quot;-ul de aici va acționa pentru &quot;if( DEBUG == 1 )&quot; în loc de &quot;if( test == 1)&quot; - bine se rezolvă ușor asta dar se poate întâmpla din neatenție.<br>
<br>Pentru punctul 1 se rezolvă repede în varianta release. Ștergi #define log și apoi toate blocurile cu log în față. În caz că îți scapă vreunu va da compilatorul eroare deci implicit vor fi toate scoase.<br><br>Mi se pare foarte interesante și metodele voastre. Le voi încerca.<br>
<br>Numai bine,<br>  - Geo<br><br><div class="gmail_quote">2011/3/6 Razvan Deaconescu <span dir="ltr">&lt;<a href="mailto:razvan.deaconescu@cs.pub.ro">razvan.deaconescu@cs.pub.ro</a>&gt;</span><br><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
<div class="im">On 03/06/2011 10:55 PM, Adrian Scoica wrote:<br>
&gt;&gt;<br>
&gt;&gt; 1) Când faci debugging, vrei să nu afișezi doar un mesaj ci, de dorit,<br>
&gt;&gt; fișierul și linia care a generat mesajul.<br>
&gt;<br>
&gt; Pentru linia curenta din fisier, se poate folosi macro-ul __LINE__<br>
&gt; (cate 2 caractere &#39;_&#39;). __LINE__ functioneaza fie in mod absolut<br>
&gt; (numarand de la inceputul fisierului), fie in mod relativ (numara<br>
&gt; incremental de la ultima directiva #line din fisier). De exemplu:<br>
&gt;<br>
&gt; /* asta e linia 4 */<br>
&gt; printf(&quot;%d&quot;,__LINE__); /* se afiseaza 5 */<br>
&gt; #line 100<br>
&gt; printf(&quot;%d&quot;,__LINE__); /* se afiseaza 100 */<br>
<br>
</div>și __FILE___ pentru fișier. Astfel, o formă bună de print debugging devine:<br>
<div class="im"><br>
---<br>
#ifdef DEBUG_<br>
#define LOG(a)               \<br>
</div>        fprintf(stderr, &quot;%s [%d]: %s\n&quot;, __FILE__, __LINE__, a)   \<br>
<div class="im">#else<br>
#define LOG(a)               \<br>
        do { } while (0)     \<br>
#endif<br>
---<br>
<br>
</div>Din păcate, presupune că a este șir ceea ce poate nu este cazul, poate<br>
îmi doresc să afișez un mesaj mai complex, ca mai jos.<br>
<div class="im"><br>
&gt;&gt; 2) Nu vrei să afișezi doar un string ci poate o afișare de forma printf.<br>
&gt;&gt; Adică LOG(&quot;x = %d, y = %d\n&quot;, x, y);<br>
&gt;<br>
&gt; In C++, poti afisa o variabila intr-un macro doar stiindu-i numele. De<br>
&gt; exemplu, daca ai:<br>
&gt;<br>
&gt; #define LOG(a) (std::cerr&lt;&lt; a &lt;&lt; &quot;\n&quot;)<br>
&gt;<br>
&gt; atunci poti afisa astfel:<br>
&gt;<br>
&gt; LOG(&quot;valoare(x): &quot; &lt;&lt; x &lt;&lt; &quot;, valoare(y) &quot; &lt;&lt; y);<br>
<br>
</div>Nu mă pricep la C++ așa că te voi crede pe cuvânt că se poate :-)<br>
<div class="im"><br>
&gt; Exista si in C o metoda mai generica? :-?<br>
<br>
</div>Da, există. Folosind Variadic Macros[1][2]. Cine vine cu o propunere<br>
care să includă Variadic Macros?<br>
<br>
Răzvan<br>
<br>
[1] <a href="http://en.wikipedia.org/wiki/Variadic_macro" target="_blank">http://en.wikipedia.org/wiki/Variadic_macro</a><br>
[2] <a href="http://gcc.gnu.org/onlinedocs/cpp/Variadic-Macros.html" target="_blank">http://gcc.gnu.org/onlinedocs/cpp/Variadic-Macros.html</a><br>
<div><div></div><div class="h5">_______________________________________________<br>
<a href="http://elf.cs.pub.ro/so/wiki/resurse/lista-discutii" target="_blank">http://elf.cs.pub.ro/so/wiki/resurse/lista-discutii</a></div></div></blockquote></div><br><br clear="all"><br>-- <br>Pandia Gheorghe<br>Emails: <a href="mailto:gheorghe.pandia@gmail.com">gheorghe.pandia@gmail.com</a>, <a href="mailto:gheorghe.pandia@yahoo.com">gheorghe.pandia@yahoo.com</a><br>
Tel: +40762684476<br>Yahoo!-Messenger-ID: gheorghe.pandia<br>Website: softproblem_dot_com<br>Blog: polidrop.host56_dot_com<br>LinkedIn: ro.linkedin_dot_com/in/gheorghepandia<br>Twitter: twitter_dot_com/gheorghepandia<br>