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-)