跨平台为宏 __FUNCTION__ 和 __func__ 定义 #define

Posted

技术标签:

【中文标题】跨平台为宏 __FUNCTION__ 和 __func__ 定义 #define【英文标题】:Cross-platform defining #define for macros __FUNCTION__ and __func__ 【发布时间】:2011-01-17 22:14:15 【问题描述】:

使用 gcc 4.4.2 和 WinXP Visual Studio C++ 2008 编译

#if defined ( WIN32 )
#define __FUNCTION__ __func__
#endif

因为我想用宏来显示函数名。我已经完成了上述操作,因此我可以跨平台,并在 linux 或 windows 上编译时使用相同的 func

但是,当我在 WinXP 上编译时,我收到以下错误:

__func__ undeclared identifier

我不能像这样#define 一个宏吗?

非常感谢您的任何建议,

【问题讨论】:

您应该使用#if defined(_MSC_VER) 而不是#if defined (_WIN32)。问题不在于您使用的是哪个操作系统。问题是您使用的是哪个编译器。 【参考方案1】:

看起来你的#define 倒退了。如果你想在两个平台上都使用__func__,而WIN32有__FUNCTION__但没有__func__,你需要这样做:

#if defined ( WIN32 )
#define __func__ __FUNCTION__
#endif

可能有更好的方法来了解您是否需要定义__func__,但这个快速破解应该可以解决问题。

请记住,在支持 __FUNCTION____func__ 关键字的编译器上,它们不是宏,因此您不能执行以下操作(因为 #ifndef __func__ 无效):

#ifndef __func__
#define __func__ __FUNCTION__
#endif

来自 C99 规范:

6.4.2.2 预定义标识符

1 标识符__func__ 应由翻译器隐式声明,就好像紧跟在每个函数定义的左大括号之后,声明

static const char __func__[] = "function-name";

出现,其中 function-name 是词法封闭函数的名称。

【讨论】:

感谢工作。但让我思考。当您说 FUNCTIONfunc 不是宏时。为什么不能在#define 中定义。另外我们怎么知道它是宏还是关键字?非常感谢。 这是一个很好的问题——我想你必须去 ANSI 规范(或谷歌)才能找到答案。在这种情况下,__func__ 是一个“预定义标识符”,根据描述,它的作用类似于函数中定义的静态 const 变量。在我上面的示例中,不起作用的部分是 #ifndef __func__,因为 __func__ 不是宏预处理器可见的已定义宏。【参考方案2】:

你当然可以#define这样的宏。然后FUNCTION 的每个实例都被__func__ 替换。但是,显然您的编译器不知道__func__。我相信VC知道__FUNCTION__,所以

#if defined ( WIN32 )
#  define __func__ __FUNCTION__
#endif

可能会。

【讨论】:

__FUNCTION__ 不是宏,因此您不能在其上添加#ifdef。与__func__ 一样,它要么是编译器的关键字,要么不是。【参考方案3】:

__FUNCTION__ 宏是在 MSVC 编译器中预定义的。你需要让它看起来像这样:

#ifndef _MSC_VER
#define __FUNCTION__ __func__
#endif

或者反过来,如果你愿意的话:

#ifdef _MSC_VER
#define __func__ __FUNCTION__
#endif

【讨论】:

我试过了,还是一样的错误。我也在条件 (MSVC) 中尝试了这个,并且得到了同样的错误。还有什么建议。谢谢。 也许是我,但是当我尝试那些 2 时,我得到了错误:“#if[n]def 需要一个标识符”。谢谢。 @robUK - 糟糕,原来的 sn-p 让我遇到了麻烦。固定。 谢谢,我应该看到括号了。我想我太习惯使用带括号的 if defined () 了。【参考方案4】:

您应该能够在任何支持 C99 的编译器中使用 __func__ 而无需任何显式宏。

【讨论】:

是的,我可以在 c89/c99 中使用它。但是,Visual Studio 2008 使用 FUNCTION。我正在尝试#define,以便我可以对 Windows 和 linux 使用相同的宏。谢谢。

以上是关于跨平台为宏 __FUNCTION__ 和 __func__ 定义 #define的主要内容,如果未能解决你的问题,请参考以下文章

_fu2___ZSt4cout 在我的 C++ 代码中占用了 21.49% 的运行时间

20170714_js闭包变量重置

如何找到父函数的__FUNCTION__、__LINE__和__FILE__?

__FILE__、__LINE__ 和 __FUNCTION__ 在 C++ 中的用法

在 Laravel 4 迁移中创建 MYSQL FUNCTION

TypeScript笔记二