是否有广泛可用的`__FILE__`的宽字符变体?

时间:2013-01-20 04:22:24

标签: c++

人们通常可以在C ++程序中使用__LINE____FILE__,使用许多工具链including GCC

GCC下的

__LINE__评估为int类型的表达式;
__FILE__评估为char const[N],其中 N 是适当的值。

  • 是否有任何主要工具链提供与__FILE__类似wchar const[N]的等效项?
  • 如果是,那是什么?

5 个答案:

答案 0 :(得分:26)

您可以制作自己的WFILE

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

答案 1 :(得分:1)

使用:

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放置{在它之前的{1}}符号,用字符串化整数。

答案 2 :(得分:-1)

在Visual Studio中,只需用_T()包围它,例如:

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

答案 3 :(得分:-1)

我会把这个答案作为对早先答复的评论,但由于没有至少50个评论的声誉而被禁止...

在Visual Studio中,_T(__ FILE__)将 NOT 扩展为L__FILE__,除非您在tchar.h头文件中修改_T的标准定义。 _T(__ FILE__)和_T(__ FUNCTION__)工作5年前,如果你正在寻找当前文件和功能的宽版本,今天仍然有效。

_T(x)定义为__T(x),在定义_UNICODE时定义为L ## x,否则定义为x。所以_T(__ FILE__)扩展为__T(“my_file.c”),然后根据_UNICODE扩展为L“my_file.c”或“my_file.c”。在声称它们不起作用之前对它进行测试是很有用的。

答案 4 :(得分:-2)

例如,使用const whar_t * name = L“” __FUNCNAME__“”;