是否可以在 gcc 3.3+ 中以旧方式使用 __func__ ? (C++)
Posted
技术标签:
【中文标题】是否可以在 gcc 3.3+ 中以旧方式使用 __func__ ? (C++)【英文标题】:Is it possible to use __func__ in gcc 3.3+ the old way? (C++) 【发布时间】:2009-08-27 09:48:15 【问题描述】:对于 3.3 之前的 gcc 版本和 MS 编译器,我使用以下宏:
DEBUG_WARNING(...) printf(">WARNING: "__FUNCTION__"() " __VA_ARGS__);
用途:
DEBUG_WARNING("someFunction returned %d", ret);
输出:
>WARNING: Class::FunctionName() someFunction returned -1
当我们有很多系统,都发送输出时,它非常方便。它是一个单行宏,允许我们相应地过滤输出。小代码,大用处,开心。
由于 __FUNCTION__
(和 C++ 中的 __func__
)定义发生了变化(我相信是为了使其符合标准),它也使得该宏无法使用。
我已经使用手动构建字符串的函数让它工作了,但我喜欢我的宏。
我是否错过了一种让这个简单的单行宏在 Gcc 3.3 下仍然工作的简单方法?
:D
【问题讨论】:
【参考方案1】:由于__FUNCTION__
和__func__
是预定义标识符而不是字符串文字,因此您不能在预处理器字符串文字连接中使用它。但是您可以在printf
格式中使用它。还要注意使用##args
而不是__VA_ARGS__
来使用GNU 风格的可变参数宏参数来解决__func__
和可能的零参数之间的逗号问题。
#define DEBUG_WARNING(fmt, args...) \
printf(">WARNING: %s() " fmt "\n", __func__, ##args)
【讨论】:
这是一种享受,稍作修改:printf(">WARNING: %s() " fmt, FUNCTION, VA_ARGS)
在我正在构建的平台上需要逗号。谢谢您的帮助! : D
感谢##技巧的提示。这让我可以让我的宏完全独立于平台而不会让人头疼。这是我最终的宏的样子:#define DEBUG_WARNING(fmt, ...) printf(">WARNING %s() " fmt, __FUNCTION__ , ## __VA_ARGS__ );
这在 GCC 4.1.1 上编译得很好,在其他 2 个平台上使用的微软编译器也是如此。以上是关于是否可以在 gcc 3.3+ 中以旧方式使用 __func__ ? (C++)的主要内容,如果未能解决你的问题,请参考以下文章
Uncaught TypeError: (0 , _reactRouter.withRouter) 在 react-router 2.4.0 中以编程方式导航路由时不是一个函数