Znacie może jakieś ciekawe makra przydatne przy debugowaniu programów w
C/C++ i/lub Qt?
Ogólnie przydało by mi się makro które zwraca nazwę funkcji w której się
znajduje. Poszukuje też od jakiegoś czasu makra które zwracało by nazwę
typu enum, który odpowiada danej liczbie.
Często w programach opartych o Qt widziałem makra __LINE__ i __FILE__. I tu
też pytanko: czy są to makra pochodzące z Qt, GCC, czy może są to
standardowe makra C++.
-- 
walec-51
Jabber: wal...@jabber.com
GG: 9008212
> Witam.
> 
> Znacie może jakieś ciekawe makra przydatne przy debugowaniu programów w
> C/C++ i/lub Qt?
Do debugowania są debuggery.
> Ogólnie przydało by mi się makro które zwraca nazwę funkcji w której się
> znajduje. 
Obawiam się trudno będzie debugować program GUI (dośc dynamiczny jeśli Qt)
przez drukowanie...
> Poszukuje też od jakiegoś czasu makra które zwracało by nazwę
> typu enum, który odpowiada danej liczbie.
Jeśli rozumiem to nie jest to wykonalne w C++
> 
> Często w programach opartych o Qt widziałem makra __LINE__ i __FILE__. I tu
> też pytanko: czy są to makra pochodzące z Qt, GCC, czy może są to
> standardowe makra C++.
Standardowe. 
Nowsze kompilatory miewają jeszcze __FUNCTION__ i to może być coś dla
ciebie
> Witam.
> 
> Znacie może jakieś ciekawe makra przydatne przy debugowaniu programów w
> C/C++ i/lub Qt?
> 
Ja do swoich programów mam takie coś:
---cut---
#ifdef DEBUG
Q_DECL_EXPORT extern QString debugDepth__;
#       define D_S(args)                { \
                                                                qDebug() <<
QString("%1  %2  %3-> %4 
%5").arg(QDateTime::currentDateTime().toString("dd MMM yyyy
hh:mm:ss.zzz")).arg(__FILE__ + QString(":") +
QString::number(__LINE__), -28, ' ').arg(debugDepth__).arg(__PRETTY_FUNCTION__).arg(QString(#args)
== "\"\"" ? " void" : "").toUtf8().data() << args; \
                                                               
debugDepth__.append("   "); \
                                                        }
#       define D_M(text)                { \
                                                                qDebug() <<
QString("%1  %2  %3@@").arg(QDateTime::currentDateTime().toString("dd MMM
yyyy hh:mm:ss.zzz")).arg(__FILE__ + QString(":") +
QString::number(__LINE__), -28, ' ').arg(debugDepth__).toUtf8().data() <<
text; \
                                                        }
#       define D_E(retval)              { \
                                                               
debugDepth__.truncate(debugDepth__.size() - 3); \
                                                                qDebug() <<
QString("%1  %2  %3<- %4
=%5").arg(QDateTime::currentDateTime().toString("dd MMM yyyy
hh:mm:ss.zzz")).arg(__FILE__ + QString(":") +
QString::number(__LINE__), -28, ' ').arg(debugDepth__).arg(__PRETTY_FUNCTION__).arg(QString(#retval)
== "\"\"" ? " void" : "").toUtf8().data() << retval; \
                                                        }
#endif
---cut---
Drukuje drzewo wywołań. Na początku funkcji robisz D_S(arg1 << arg2 << arg3)
bez argumentów D_S(""), w środku wywołania funkcji D_M("tekst" << cos) na
koniec D_E(zwracana_wartosc) ale strasznie uciążliwe w stosowaniu.
> Ogólnie przydało by mi się makro które zwraca nazwę funkcji w której się
> znajduje. Poszukuje też od jakiegoś czasu makra które zwracało by nazwę
> typu enum, który odpowiada danej liczbie.
>
__FUNCTION__ i __PRETTY_FUNCTION_
 
Co do enum to nie znajdziesz, bo enum na etapie kompilacji jest zamieniane
na int i program nawet nie wie o czymś takim jak enum.
> Często w programach opartych o Qt widziałem makra __LINE__ i __FILE__. I
> tu też pytanko: czy są to makra pochodzące z Qt, GCC, czy może są to
> standardowe makra C++.
> 
IMHO kompilatów czyli C++.
-- 
Artur Zabroński
E-mail: artur (dot) zabronski (at) gmail (dot) com
Jabber: artur (dot) zabronski (at) gmail (dot) com
> > Często w programach opartych o Qt widziałem makra __LINE__ i
> > __FILE__. I tu też pytanko: czy są to makra pochodzące z Qt, GCC,
> > czy może są to standardowe makra C++.
> Standardowe. 
> Nowsze kompilatory miewają jeszcze __FUNCTION__ i to może być coś dla
> ciebie
a do czego sluza te makra? 
Wstawiają w miejscu użycia bieżącą linię w pliku / nazwę pliku /
nazwę funkcji - dzięki czemu można je użyć jak np. tu:
http://www.thescripts.com/forum/thread214401.html
Pozdrawiam,
Waldek
> Poszukuje też od jakiegoś czasu makra które zwracało by nazwę
> typu enum, który odpowiada danej liczbie.
Da się jeśli zadeklarujesz ten typ makrem Q_ENUM, co wymaga by klasa 
zawierająca go była Q_OBJECT'em, czyli to kosztuje.
W Qt4 :
int wartoscInt = ..........;
const char* nazwaTypuEnum = "...........";
QObject * obiekt = .........;
QByteArray nazwaTypu =
  obiekt->metaObject()->enumerator(
   obiekt->metaObject()->indexOfEnumerator( nazwaTypuEnum )
  )->valueToKey ( wartoscInt );
Co ciekawe jest też QMetaEnum::valueToKeys( int value ) dające kombinację 
wartości w stylu "Raz|Dwa|Trzy".
W Qt 3 podobnie, a nawet trochę mniej kodu.
-- 
regards / pozdrawiam, Jaroslaw Staniek
  Sponsored by OpenOffice Polska (http://www.openoffice.com.pl/en) to work on
  Kexi & KOffice: http://www.kexi-project.org, http://www.koffice.org
  KDE3 & KDE4 Libraries for MS Windows: http://kdelibs.com, http://www.kde.org
> Witam.
> 
> Znacie może jakieś ciekawe makra przydatne przy debugowaniu programów w
> C/C++ i/lub Qt?
Zapoznaj się bliżej z tematem preprocesora c/c++. Google znajdzie ci
wiele przydatnych wyników ;)
Chyba każdy programista (na pewno c i c++) z czasem dorabia się swojego
małego zbioru "makr do wszystkiego". 
  W C++ polecam ortodoksyjne przechodzenie z makr na szablony. Bywają
nieco trudniejsze do napisania, ale mają sporo zalet:
 - możliwość chowania w namespace'ach
 - nie podmieniają "na wariata" wszystkich wystąpień identyfikatora
(mają normalne zakresy widzialności)
 - pozwalają na statyczną kontrolę typów
  Owszem - nie da się w nich wszystkiego zrobić (gdzieś to __LINE__ i
__FILE__ trzeba jednak zapakować), ale warto popróbować.
-- 
    Paweł Kierski
    ne...@pkierski.net
    dodaj "[nomorespam]" w temacie jeśli piszesz z domeny innej niż .pl,
    albo koniecznie chcesz obejść moje filtry 8-)