是否可以在 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++)的主要内容,如果未能解决你的问题,请参考以下文章

24_在项目中以经典的3节点方式部署哨兵集群

Visual Studio 中的 GCC 样式弱链接?

Uncaught TypeError: (0 , _reactRouter.withRouter) 在 react-router 2.4.0 中以编程方式导航路由时不是一个函数

在iphone中以编程方式列出所有wifi SSID

Linux gcc支持的语法 __attribute__ 属性设置

如何知道二进制文件是否已与“pie”链接器标志链接?