Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Capture __LINE__ and __FILE__ without #define

Tags:

c++

c++11

Trying to determine a "modern" implementation for the following C-style code:

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

Is is possible to capture this using variadic templates or something similar that does not rely on a #define ?

Desired use case:

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

Where __FILE__, and __LINE__ are captured under the hood, but reflect the file name and line number of where logError was called from.

like image 647
davepmiller Avatar asked Apr 25 '16 21:04

davepmiller


2 Answers

Macros are indeed your only choice, at least until std::source_location makes it into the standard and fulfills your wish.

like image 196
Quentin Avatar answered Sep 22 '22 12:09

Quentin


Actually the preprocessor is the only choice when you want to work with line numbers and filenames.

For the compiler it's not possible to use line numbers and filenames as arguments for function calls (or storing them in a variable).

In my company we had the exactly same issue with logging. We ended up with an external script scanning the source files and then building proper functions to call.

like image 34
Günther Jena Avatar answered Sep 21 '22 12:09

Günther Jena