2016-04-25 13 views
6

Próba określenia „nowoczesne” implementację następującego kodu C-style:Przechwytywanie __LINE__ i __FILE__ bez #define

#define logError(...) log(__FILE__, __LINE__, __VA_ARGS__) 

Czy jest możliwe, aby uchwycić to za pomocą zmiennej liczbie argumentów szablonów lub coś podobnego, że nie opierają się na a #define?

Pożądany przypadek użycia:

logError("Oh no! An error occurred!"); 

Gdzie __FILE__ i __LINE__ są ujęte pod maską, ale odzwierciedlać nazwę pliku i numer wiersza, gdzie logError nazwano od.

+2

Nie sądzę, że to możliwe. Makro istnieje z jakiegoś powodu i możesz go użyć w razie potrzeby. –

+0

Prosisz o tworzenie miękkich punktów przerwania przy takim logowaniu. – tadman

Odpowiedz

5

W rzeczywistości preprocesor jest jedynym wyborem, gdy chce się pracować z numerami linii i nazwami plików.

Dla kompilatora nie można używać numerów linii i nazw plików jako argumentów dla wywołań funkcji (lub zapisywania ich w zmiennej).

W mojej firmie mieliśmy dokładnie ten sam problem z logowaniem. Skończyło się na zewnętrznym skrypcie skanującym pliki źródłowe, a następnie budowaniu odpowiednich funkcji do wywoływania.

11

Makra są naprawdę jedynym wyborem, przynajmniej do momentu, gdy std::source_location stanie się standardem i spełni twoje życzenie.

+3

'std :: source_location' wygląda dobrze! * twiddles thumbs * – DaveyLaser

+0

To jest groovy. Zastanawiam się, czy używają ray tracing ... – user4581301

+0

Fajnie, nie wiedziałem, że ... –