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

时间:2010-02-17 15:34:50

标签: c visual-studio macros

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

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

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

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

__func__ undeclared identifier

我不能#define像这样的宏吗?

非常感谢任何建议,

4 个答案:

答案 0 :(得分:25)

看起来你的#define落后了。如果您想在两个平台上使用__func__,而WIN32有__FUNCTION__但不是__func__,则需要这样做:

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

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

请注意,在支持__FUNCTION____func__关键字的编译器上,它们不是宏,因此您无法执行以下操作(因为#ifndef __func__无效):< / p>

#ifndef __func__
#define __func__ __FUNCTION__
#endif

来自C99规范:

  

6.4.2.2预定义标识符

     

1标识符__func__应由翻译者隐式声明,就像紧接每个函数定义的左括号一样,声明

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

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

答案 1 :(得分:6)

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

#ifndef _MSC_VER
#define __FUNCTION__ __func__
#endif

或者相反,如果您愿意:

#ifdef _MSC_VER
#define __func__ __FUNCTION__
#endif

答案 2 :(得分:2)

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

答案 3 :(得分:1)

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

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

可能会这样做。