跨平台为宏 __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 是词法封闭函数的名称。
【讨论】:
感谢工作。但让我思考。当您说 FUNCTION 和 func 不是宏时。为什么不能在#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% 的运行时间
如何找到父函数的__FUNCTION__、__LINE__和__FILE__?
__FILE__、__LINE__ 和 __FUNCTION__ 在 C++ 中的用法