Ответ 1
Вы можете создать свой собственный WFILE
:
#define WIDE2(x) L##x
#define WIDE1(x) WIDE2(x)
#define WFILE WIDE1(__FILE__)
Обычно можно использовать __LINE__
и __FILE__
в программах на С++ со многими инструментальными цепочками включая GCC.
__LINE__
под GCC оценивает выражение типа int
; __FILE__
оценивается как char const[N]
, где N - соответствующее значение.
__FILE__
с типом wchar const[N]
?Вы можете создать свой собственный WFILE
:
#define WIDE2(x) L##x
#define WIDE1(x) WIDE2(x)
#define WFILE WIDE1(__FILE__)
Использование:
WIDE(MEXPAND(__FILE__))
и
WIDE(STRINGIFY(__LINE__))
или замените __LINE__
на что-нибудь, что необходимо выполнить, и замените __FILE__
на любой литерал макрокоманды, который вы хотите расширить.
Используя следующие определения:
#define STRINGIFY2(m) #m
#define MEXPAND(m) m
#define STRINGIFY(m) STRINGIFY2(m)
#define WIDE(m) L ## m
Пример использования:
#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)
Обратите внимание, что весь параметр OutputDebugString статически собран во время компиляции в однострочный литерал.
Трюк с строкой макроса передает его через другой макрос. Когда __FILE__
передается на MEXPAND
, он расширяется в это время. MEXPAND
возвращает свой аргумент, который теперь является строкой. Тогда законно поставить ведущий L, чтобы сделать его широким.
STRINGIFY
делает тот же трюк, он передает свой аргумент через STRINGIFY2
, который расширяет аргумент до номера строки (который выглядит как целое число в этой точке), затем STRINGIFY2
помещает символ #
перед ним, строгая целое число.
В Visual Studio просто окружайте его _T()
, например:
TRACE( _T("function = %s"), _T(__FUNCTION__);
Я бы поставил этот ответ в качестве комментария к более раннему ответу, но не был допущен из-за отсутствия репутации минимум 50 репутации...
В Visual Studio _T (__ FILE__) будет НЕ раскрываться до L__FILE__, если вы не измените стандартное определение _T в заголовочном файле tchar.h. _T (__ FILE__) и _T (__ FUNCTION__) работал 5 лет назад и по-прежнему работает сегодня, если вы ищете широкие версии текущего файла и функции.
_T (x) определяется как __T (x), который определяется как L ## x, когда _UNICODE определен и x в противном случае. Итак, _T (__ FILE__) расширяется до чего-то вроде __T ( "my_file.c" ), который затем расширяется до L "my_file.c" или "my_file.c" в зависимости от _UNICODE. Полезно проверять вещи, прежде чем утверждать, что они не работают.