[ Neznalica_sa_ugla @ 04.06.2006. 11:28 ] @
Kako u c++ treba da izgleda nesšo kao GetFunctionName -> ime funkcije koja se izvrsava ili
nekoliko njih prije ??
HVALA


LJUDI MOZE LI MI IKO POMOCI , DAJATE BAREM GDJE TO MOGU PROČITATI !!!!

hVALA DRAGOM TATI , ALI MAMI TO BAŠ I NE POMAŽE


Hvala svima koji se javise , sve ove primedbe su mi pomogle i resavaju mi problem u 95 %


[Ovu poruku je menjao Neznalica_sa_ugla dana 17.06.2006. u 08:33 GMT+1]
[ Dragi Tata @ 04.06.2006. 13:23 ] @
Neki kompajleri imaju definisan makro __FUNCTION__ za tu svrhu, ali to nije deo standarda.
[ Neznalica_sa_ugla @ 11.06.2006. 16:36 ] @
Da se neko javi ???
[ kiklop74 @ 11.06.2006. 17:23 ] @
Lepo ti je rečeno da to nije podržano u standardnom C++.

Jedini kompajler koji ima __FUNCTION__ je gnu gcc. Vidi ovde:

http://www.delorie.com/gnu/docs/gcc/gcc_78.html

Ovo predstavlja nestandardnu ekstenziju kkoja nije portabilna na druge kompajlere.

Da bi tako nešto moglo da se uradi C++ bi trebao da ima Reflection kao .NET framework.

[ nikoladsp @ 14.06.2006. 14:19 ] @
jedno (mozda malo egzoticno) resenje bi bilo da instaliras mingw32 i nakon toga da napravis dll i/ili lib u koji bi natrpao sve makroe koje ima gcc (izmedju ostalih i __FUNCTION__ i sl.) , napravis f-ju za svaki (tebi interesantan) da ti vrati recimo std::string (koji je vrednost makroa) i da pozoves iz tvog VC projekta te f-je.


ja cu praviti nesto slicno ovih dana jer mi treba loger.ako uspem i budes zainteresovan, postovacu kod ovde

poz.
nikola
[ Dragi Tata @ 14.06.2006. 15:13 ] @
Ma ima i VC++ __FUNCTION__ makro: http://msdn2.microsoft.com/en-us/library/b0084kay.aspx
[ NastyBoy @ 14.06.2006. 22:12 ] @
Pa ako compiler-specific kod ne zadovoljava -> do-it-yourself.

Vidjao sam i skupe komercijalne biblioteke koje problem reshavaju (relativno) jednostavnim makroima tipa:

void MyClass::SomeFn()
{
ENTER_METHOD(MyClass, SomeFn);
//...
END_METHOD;
}

gde makro mozhe biti komplikovan koliko ti je potrebno, od prostog:

#define ENTER_METHOD(classname, methodname)\
printf("Exec: %s :: %s", #classname, #methodname)

pa do koda (u pomenutim bibliotekama) koji pomocu makroa konstruishe call-trace (recimo makro ENTER_METHOD bi dodao jedan sub-node u stablu za call-trace, END_METHOD bi vratio za jedan nivo vishe itd. do proizvoljne dubine). Relativno je jednostavno napraviti puni call-trace ovakvim metodama.

Naravno, sve ovo funkcionishe u scope-u funkcije koja se trenutno izvrshava, i pod uslovom da strogo poshtujesh konvencije poziva funkcija, ali slichna ogranichenja ima i pomenuti __FUNCTION__ .


Mada, uvek mozhesh da zasuchesh rukave i napravish propisnu reflection podrshku u svojim baznim klasama... chini mi se da VCF (http://vcf-online.org/) to ima korektno odradjeno, vredi pogledati, ako nishta drugo ono radi reference.

[Ovu poruku je menjao NastyBoy dana 15.06.2006. u 01:07 GMT+1]
[ tosa @ 15.06.2006. 13:57 ] @
A može i hard-core rešenje. Napraviš stack walker, koji je naravno platform dependant, i onda kada ti treba
ime funkcije (assert failed na primer) na brzinu isprarsiraš .MAP fajl i saznaš preko adrese i ime funkcije, ili
celog call stack-a. Možda zvuči preterano, ali baš to koristim sada ;)
[ cynique @ 16.06.2006. 05:06 ] @
Može i lakše preko debug simbola:

http://www.codeproject.com/thr...4&exp=0&select=1444941
[ Goran Arandjelovic @ 16.06.2006. 16:02 ] @
@Toša
Hajde neki kratak primer u vezi toga... :)
[ tosa @ 17.06.2006. 02:33 ] @
@cynique
Zavisi u potpunosti od platforme na kojoj radiš.

@Goran
Primer ne bi bio samo platformski zavisan, već bi se oslanjao i na odredjenu verziju kompajlera
(zato što je moguća i drugačija calling convention). Ideja je jednostavna, kada program "pukne",
imati exception handler koji će pozvati stack walker koji će ti vratiti ime/imena funkcije.
Idealno je kada platforma ima sistemske exception handlere, tada možeš da hvataš sve
vrste grešaka, kao što je deljenje nulom i slično.

Platforma na kojoj radim sada nema exception handlere ni za šta, iz sigurnosnih razloga, i ima
veoma ograničenu memoriju, tako da nisam imao mnogo izbora šta da radim...