使用gcc 4.4.2和WinXP中的Visual Studio C++ 2008进行编译
#if defined ( WIN32 )
#define __FUNCTION__ __func__
#endif
我想要使用宏来显示函数名。我已经完成了上述操作,以便于跨平台,在linux或windows编译时使用相同的func。
然而,在WinXP上编译时,我遇到了以下错误:
__func__ undeclared identifier
我能不能不这样定义宏?
非常感谢任何建议,
使用gcc 4.4.2和WinXP中的Visual Studio C++ 2008进行编译
#if defined ( WIN32 )
#define __FUNCTION__ __func__
#endif
我想要使用宏来显示函数名。我已经完成了上述操作,以便于跨平台,在linux或windows编译时使用相同的func。
然而,在WinXP上编译时,我遇到了以下错误:
__func__ undeclared identifier
我能不能不这样定义宏?
非常感谢任何建议,
看起来你的#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";
出现在函数名为词法封闭函数的名称的位置。
__func__
是一个“预定义标识符”,根据描述,它的作用类似于在函数中定义的静态const变量。在我上面的示例中,不起作用的部分是#ifndef __func__
,因为__func__
不是宏预处理器可见的已定义宏。 - tomlogic__FUNCTION__
宏在MSVC编译器中预定义。您需要将其设置为以下格式:
#ifndef _MSC_VER
#define __FUNCTION__ __func__
#endif
#ifdef _MSC_VER
#define __func__ __FUNCTION__
#endif
在支持C99的任何编译器中,您应该能够使用__func__
而无需任何显式的宏。
你当然可以使用#define
定义这样的宏。每个FUNCTION
实例都将被替换为__func__
。但是,显然你的编译器不认识__func__
。我相信VC知道__FUNCTION__
,所以
#if defined ( WIN32 )
# define __func__ __FUNCTION__
#endif
可能会做。
__FUNCTION__
不是宏,因此您无法在其上使用#ifdef。与__func__
一样,它要么是编译器的关键字,要么就不是。 - tomlogic