使用gcc 4.4.2和WinXP Visual Studio C ++ 2008进行编译
#if defined ( WIN32 )
#define __FUNCTION__ __func__
#endif
因为我想使用宏来显示函数名称。我已经做了以上所以我可以跨平台,并在linux或windows上编译时使用相同的 func 。
但是,当我在WinXP上编译时,我收到以下错误:
__func__ undeclared identifier
我不能#define像这样的宏吗?
非常感谢任何建议,
答案 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
可能会这样做。