人们通常可以在C ++程序中使用__LINE__
和__FILE__
,使用许多工具链including GCC。
__LINE__
评估为int
类型的表达式;
__FILE__
评估为char const[N]
,其中 N 是适当的值。
__FILE__
类似wchar const[N]
的等效项?答案 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__“”;