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