Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

[C/C++] Makra do debug'owania i nie tylko.

12 views
Skip to first unread message

walec51

unread,
Feb 22, 2007, 11:49:20 AM2/22/07
to
Witam.

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

Jacek Czerwinski

unread,
Feb 22, 2007, 12:08:58 PM2/22/07
to
Dnia Thu, 22 Feb 2007 17:49:20 +0100, walec51 napisał(a):

> 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

Artur Zabroński

unread,
Feb 22, 2007, 1:33:58 PM2/22/07
to
walec51 wrote:

> 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

Sulsa

unread,
Feb 22, 2007, 5:37:08 PM2/22/07
to
On Thu, 22 Feb 2007 18:08:58 +0100
Jacek Czerwinski <x...@y.z.pl> wrote:


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

Waldek M.

unread,
Feb 22, 2007, 6:51:11 PM2/22/07
to
Sulsa napisał(a):

>>> 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++.
>> 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

Jarosław Staniek

unread,
Feb 22, 2007, 6:59:40 PM2/22/07
to
walec51 said the following, On 2007-02-22 17:49:

> 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

hawat

unread,
Feb 23, 2007, 11:42:03 PM2/23/07
to
Dnia Thu, 22 Feb 2007 17:49:20 +0100, walec51 napisał(a):

> 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".

Paweł Kierski

unread,
Feb 26, 2007, 3:25:29 AM2/26/07
to
hawat w wiadomości <pan.2007.02.24....@deepspace.space> pisze:

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

0 new messages