One may generally use __LINE__
and __FILE__
in C++ programs, with many toolchains, including GCC.
__LINE__
under GCC evaluates
Use:
WIDE(MEXPAND(__FILE__))
and
WIDE(STRINGIFY(__LINE__))
or replace __LINE__
with anything that needs to be stringified, and replace __FILE__
with any macro string literal you want to widen.
Using the following definitions:
#define STRINGIFY2(m) #m
#define MEXPAND(m) m
#define STRINGIFY(m) STRINGIFY2(m)
#define WIDE(m) L ## m
Example usage:
#define AssertBreakMethod DebugBreak
#define AssertBreakForce(expr) \
do \
{ \
if (!(expr)) \
{ \
OutputDebugStringW(WIDE(MEXPAND(__FILE__)) \
WIDE("(") WIDE(STRINGIFY(__LINE__)) \
WIDE("): Assertion failed: ") \
WIDE(#expr) WIDE("\n")); \
AssertBreakMethod(); \
} \
} \
while (0)
Note that the whole parameter to OutputDebugString is assembled statically at compile time into a single string literal.
The trick with stringification of a macro is passing it through another macro. When __FILE__
is passed to MEXPAND
it is expanded at that time. MEXPAND
returns its argument which is now a string. It is then legal to put the leading L there to make it wide.
STRINGIFY
does the same trick, it passes its argument through STRINGIFY2
which expands the argument to the line number (which looks like an integer at that point) then STRINGIFY2
puts the #
symbol before it, stringifying the integer.