Linux 上 __FUNCTION__ 的宽版本
有没有办法在 Linux 上将 __FUNCTION__ 打印为宽字符?
WIDEN 的技巧对我不起作用,gcc 编译器打印: 错误:?L_功能_?没有在此范围内声明
有什么帮助吗? 谢谢
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
有没有办法在 Linux 上将 __FUNCTION__ 打印为宽字符?
WIDEN 的技巧对我不起作用,gcc 编译器打印: 错误:?L_功能_?没有在此范围内声明
有什么帮助吗? 谢谢
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(3)
7年多后(尽管事情似乎是一样的)......
既然你提到了gcc,请检查[GNU.GCC]:标准预定义宏(强调是我的):
由于 __FUNCTION__ 不是一个宏(预处理器不“知道”任何关于它的事情),它在(外部)宏扩展期间将保持不变,并在最后生成
L__FUNCTION__
标识符,这显然是无效的。这就是为什么双宏方法适用于__FILE__(例如),但不适用于__FUNCTION__(或 __func__)。
因此,您的问题的简短答案是“否”(至少在预处理器级别不)。您需要“手动”转换__FUNCTION__(例如使用[man7]:MBSTOWCS(3) 函数系列)。
注意:它适用于VStudio,因为根据[MS.Docs]:预定义宏(强调仍然是我的):
7+ years later (although things seem to be the same) ...
Since you mentioned gcc, check [GNU.GCC]: Standard Predefined Macros (emphasis is mine):
Since __FUNCTION__ is not a macro (the preprocessor doesn't "know" anything about it), it will remain untouched during (outer) macro expansion, generating at the end the
L__FUNCTION__
identifier, which is obviously invalid.That's why the double macro approach works for __FILE__ (for example), but not for __FUNCTION__ (or __func__).
So, the short answer to your question is "NO" (at least not at preprocessor level). You will need to convert __FUNCTION__ "manually" (e.g. using one of the [man7]: MBSTOWCS(3) functions family).
Note: It works on VStudio, since according to [MS.Docs]: Predefined Macros (emphasis still mine):
可以使用宏来完成,您只需要了解宏如何扩展即可。
要获得宏的宽字符版本,您需要创建 2 层宏,如下所示:
最重要的部分是
L##x
,它将 L 字符附加到在编译器看到之前的字符串常量。您也可以使用相同的技术对 __FILE__ 执行此操作。It can be done using macros, you just have to understand how macros expand.
To get a wide char version of the macro you need to create 2 layers of macros like so:
The all important piece is the
L##x
that appends the L character to the string constant before the compiler sees it. You can do this to__FILE__
as well using the same technique.这看起来更像是
__FUNCTION__
的拼写错误,而不是widen()
或类似问题,至少如果您粘贴了确切的错误消息的话。That looks more like a typo of
__FUNCTION__
than an issue withwiden()
or similar, at least if you pasted the exact error message.