Linux 上 __FUNCTION__ 的宽版本

发布于 2024-10-13 12:22:55 字数 128 浏览 1 评论 0 原文

有没有办法在 Linux 上将 __FUNCTION__ 打印为宽字符?

WIDEN 的技巧对我不起作用,gcc 编译器打印: 错误:?L_功能_?没有在此范围内声明

有什么帮助吗? 谢谢

is there a way i can print __FUNCTION__ as a wide character on linux?

the trick with the WIDEN doesn't work for me, the gcc compiler prints:
error: ?L_FUNCTION_? was not declared in this scope

any help?
Thanks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

等待圉鍢 2024-10-20 12:22:55

7年多后(尽管事情似乎是一样的)......

既然你提到了gcc,请检查[GNU.GCC]:标准预定义宏强调是我的):

C99引入了__func__,GCC很早就提供了__FUNCTION__。这两个都是包含当前函数名称的字符串(有轻微的语义差异;请参阅 GCC 手册)。 它们都不是宏;预处理器不知道当前函数的名称

由于 __FUNCTION__ 不是一个宏(预处理器不“知道”任何关于它的事情),它在(外部)宏扩展期间将保持不变,并在最后生成L__FUNCTION__ 标识符,这显然是无效的。
这就是为什么双宏方法适用于__FILE__(例如),但不适用于__FUNCTION__(或 __func__)。

因此,您的问题的简短答案是“”(至少在预处理器级别)。您需要“手动”转换__FUNCTION__(例如使用[man7]:MBSTOWCS(3) 函数系列)。

注意:它适用于VStudio,因为根据[MS.Docs]:预定义宏强调仍然是我的):

  • __FUNCTION__ 定义为包含封闭函数的未修饰名称的字符串文字。 仅在函数内定义。

7+ years later (although things seem to be the same) ...

Since you mentioned gcc, check [GNU.GCC]: Standard Predefined Macros (emphasis is mine):

C99 introduced __func__, and GCC has provided __FUNCTION__ for a long time. Both of these are strings containing the name of the current function (there are slight semantic differences; see the GCC manual). Neither of them is a macro; the preprocessor does not know the name of the current function.

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):

  • __FUNCTION__ Defined as a string literal that contains the undecorated name of the enclosing function. The macro is defined only within a function.
酸甜透明夹心 2024-10-20 12:22:55

可以使用宏来完成,您只需要了解宏如何扩展即可。
要获得宏的宽字符版本,您需要创建 2 层宏,如下所示:

#define WIDE2(x) L##x
#define WIDECHAR(x) WIDE2(x)

#define WIDE_FUNCTION WIDECHAR(__FUNCTION__)

最重要的部分是 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:

#define WIDE2(x) L##x
#define WIDECHAR(x) WIDE2(x)

#define WIDE_FUNCTION WIDECHAR(__FUNCTION__)

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.

撧情箌佬 2024-10-20 12:22:55

这看起来更像是 __FUNCTION__ 的拼写错误,而不是 widen() 或类似问题,至少如果您粘贴了确切的错误消息的话。

That looks more like a typo of __FUNCTION__ than an issue with widen() or similar, at least if you pasted the exact error message.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文