WFILE
:#define WIDE2(x) L##x
#define WIDE1(x) WIDE2(x)
#define WFILE WIDE1(__FILE__)
测试了包含非ASCII字符和文件名为马克.cpp
的情况:
#include <stdio.h>
#include <io.h>
#include <fcntl.h>
#define WIDE2(x) L##x
#define WIDE1(x) WIDE2(x)
#define WFILE WIDE1(__FILE__)
int main() {
_setmode(_fileno(stdout), _O_U16TEXT); // required for Unicode output to console
wprintf(L"%s\n", WFILE);
}
演示(从cmd.exe运行并安装了中文语言支持):
C:\>cl /W4 /nologo 马克.cpp
马克.cpp
C:\>马克.exe
马克.cpp
_T(__FILE__)
对我也起作用,但我被告知这不是正确的解决方案。 - zar_T()
将其括起来,例如:TRACE( _T("function = %s"), _T(__FUNCTION__);
使用:
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)
##
运算符之前,宏扩展将被抑制,所以_T(__FILE__)
会生成L__FILE__
。此外,不要定义保留名称,即使是为了模拟另一个平台。特别是对于只有两个字符的情况——_T
很可能在其他编译器中代表其他含义。最好使用#define WIDEN _T
来定义一个非保留名称,以便跨平台使用。 - Potatoswatter_T
是这样定义的,我不确定为什么它会被认为是一种供大众使用的实用工具。 - Potatoswatter_T(__FILE__)
会扩展为 L__FILE__
。 - Potatoswatter我本来想把这个答案作为早期回复的评论,但由于没有最低50个声望来评论,所以不允许...
在Visual Studio中,_T(__FILE__)不会扩展到L__FILE__,除非您修改了tchar.h头文件中_T的标准定义。如果您正在寻找当前文件和函数的宽版本,则5年前_T(__FILE__)和_T(__FUNCTION__)有效,今天仍然有效。
_T(x)被定义为__T(x),当定义了_UNICODE时,它被定义为L##x,否则为x。因此,_T(__FILE__)扩展为类似__T("my_file.c")的内容,然后根据_UNICODE扩展为L"my_file.c"或"my_file.c"。在声称它们无法工作之前测试它们是有用的。
auto name = L"" __FUNCTION__;
。wchar_t
,但这样行不通,而且宏也错了。 - Lightness Races in Orbit#define __W_FUNCTION__ L"" __FUNCTION__
<br/><br/>const wchar_t *msg = L"" __FUNCTION__ ": one message.";
<br/>const wchar_t *msg2 = __W_FUNCTION__ ": one more message.";
<br/>它利用编译器连接相邻字符串文字的事实。(<br/>是换行符,在我的计算机上不起作用)。 - Big Steak On The Grill__FUNCNAME__
,这个只在VS中有效),但是似乎可以工作。这里是标准文档:似乎存在实现定义的结果是否模棱两可。这可能是一个好答案的基础。 - Lightness Races in Orbit__FUNCTION__
。你的例子是 __FILE__
。尽管如此,我的方法与其他预定义宏一起工作得很好,这些宏通常只提供为 const char[](例如使用建议的 define 语句)。我在 VS 中检查了你的代码片段,它在那里可以工作。如果您不介意,请更改给定解决方案的评级。 - Big Steak On The Grill