Reputation: 5570
I want my exception messages to contain information about the exception location.
So I would like to have something like this:
#define LOCATION __FILE__ " : " __LINE__
throw std::exception(std::string("ABCD. ") + LOCATION);
That define is obviously incorrect. How can I achieve this?
Upvotes: 47
Views: 19460
Reputation: 56479
You need to expand that macro in two levels:
#define S1(x) #x
#define S2(x) S1(x)
#define LOCATION __FILE__ " : " S2(__LINE__)
Here is the reason:
You need expand __LINE__
in two levels, before passing it to #x
.
First of all, using operator #
in a function-like macro, it has to be followed by a macro parameter but __LINE__
is not a parameter, so compiler complains it's a stray operator.
On the other hand, __LINE__
itself is a macro and contains current line number, it should be expanded to the number before using it with #
, otherwise, you will get string "__LINE__"
instead of a number.
Macro S2(__LINE__)
expands __LINE__
to a line number, then we pass the line number to #x
.
Upvotes: 76