Jak wygodnie korzystać z __LINE__ i __FILE__

Ostatnio rozwijam wraz z kolegą dość prosty projekt o wdzięcznej nazwie kodowej Egzaminator który to powstaje na pobożną prośbę naszego nauczyciela któremu bardzo na rękę byłoby przeprowadzanie egzaminów zawodowych z informatyki w sposób bardziej skomputeryzowany :)

W ramach pisania prostej klasy o wdzięcznej nazwie CException doszedłem do wniosku iż sprzydałoby się w jakiś sposób uzyskiwać informacje dokładnie w którym miejscu został rzucony wyjątek.

Na szczęście preprocesor udostępnia dwie bardzo przydatne dyrektywy, mowa tu oczywiście o __FILE__ (zamienia się na nazwę pliku) oraz __LINE__ (zamienia się na numer aktualnej linijki kodu). Niestety o ile __FILE__ zamienia się na cstring i można go użyc np: w taki sposób:

throw Exception(“Rzucono wyjątek w pliku” __FILE__”);

(co jest możliwe dzięki temu że kompilator składa sąsiadujące cstringi oddzielone białymi znakami w jeden – sytuacja analogiczna do “Ale ” “fajnie” => “Ale fajnie”)

to w przypadku __LINE__ nie jest tak prosto gdyż jest to wartośc numeryczna a nie cstring. Przypadkowo znalazłem w sieci rozwiązanie tego problemu.

Rozwiązanie wygląda w ten sposób:

#define STRINGIFY(x) #x
#define NUMBERTOSTRING(x) STRINGIFY(x)
#define ERROR_PLACE __FILE__ ” : ” NUMBERTOSTRING(__LINE__)

Teraz można tego użyć w ten sposób:

throw Exception(“Wystąpił wyjątek w ” ERROR_PLACE);

co zostanie zamienione na Wystąpił wyjątek w main.cpp : 14

Dodaj komentarz