Существует ли широко распространенный широкоформатный вариант `__FILE__`?

Обычно можно использовать __LINE__ и __FILE__ в программах на С++ со многими инструментальными цепочками включая GCC.

__LINE__ под GCC оценивает выражение типа int;
__FILE__ оценивается как char const[N], где N - соответствующее значение.

  • Предоставляет ли какая-либо основная инструментальная цепочка эквивалент __FILE__ с типом wchar const[N]?
  • Если да, то что это?

Ответ 1

Вы можете создать свой собственный WFILE:

#define WIDE2(x) L##x
#define WIDE1(x) WIDE2(x)
#define WFILE WIDE1(__FILE__)

Ответ 2

Использование:

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 помещает символ # перед ним, строгая целое число.

Ответ 3

В Visual Studio просто окружайте его _T(), например:

TRACE( _T("function = %s"), _T(__FUNCTION__);

Ответ 4

Я бы поставил этот ответ в качестве комментария к более раннему ответу, но не был допущен из-за отсутствия репутации минимум 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. Полезно проверять вещи, прежде чем утверждать, что они не работают.