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

ant*_*009 19 c macros visual-studio

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

#if defined ( WIN32 )
#define __FUNCTION__ __func__
#endif
Run Code Online (Sandbox Code Playgroud)

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

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

__func__ undeclared identifier
Run Code Online (Sandbox Code Playgroud)

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

非常感谢任何建议,

tom*_*gic 25

看起来你有你的#define落后.如果你想__func__在两个平台上使用,而WIN32有,__FUNCTION____func__你需要这样做:

#if defined ( WIN32 )
#define __func__ __FUNCTION__
#endif
Run Code Online (Sandbox Code Playgroud)

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

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

#ifndef __func__
#define __func__ __FUNCTION__
#endif
Run Code Online (Sandbox Code Playgroud)

从C99规范:

6.4.2.2预定义标识符

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

static const char __func__[] = "function-name";
Run Code Online (Sandbox Code Playgroud)

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


Han*_*ant 6

__FUNCTION__在MSVC编译器宏预先定义.你需要让它看起来像这样:

#ifndef _MSC_VER
#define __FUNCTION__ __func__
#endif
Run Code Online (Sandbox Code Playgroud)

或者相反,如果您愿意:

#ifdef _MSC_VER
#define __func__ __FUNCTION__
#endif
Run Code Online (Sandbox Code Playgroud)