2010-02-17 82 views
17

用gcc 4.4.2和WinXP的Visual Studio C++ 2008跨平台定义的#define的宏__FUNCTION__和__func__

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

因为我想用宏显示功能名称书写。我已经完成了上述工作,所以我可以跨平台,并在Linux或Windows上编译时使用相同的func

然而,当我编译在WinXP我得到以下错误:

__func__ undeclared identifier 

我不能#定义这样一个宏?

非常感谢您的任何建议,

+3

您应该使用#if defined(_MSC_VER)而不是#if defined(_WIN32)。问题不在于你使用的是哪个操作系统。问题是你正在使用哪个编译器。 – 2015-01-17 17:54:21

回答

24

看起来你有你的#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 Predefined identifiers

1 The identifier __func__ shall be implicitly declared by the translator as if, immediately following the opening brace of each function definition, the declaration

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

appeared, where function-name is the name of the lexically-enclosing function.

+0

谢谢你的工作。但是让我想到了。当你说__FUNCTION__和__func__不是宏。为什么你不能在#define中定义。另外我们如何知道它是宏还是关键字?非常感谢。 – ant2009 2010-02-18 02:09:37

+1

这是一个很好的问题 - 我想你必须去ANSI规范(或谷歌)找出。在这种情况下,'__func__'是一个“预定义标识符”,并且基于描述,就像函数中定义的静态常量变量。 在我上面的例子中,不工作的部分是'#ifndef __func__',因为'__func__'不是对宏预处理器可见的定义的宏。 – tomlogic 2010-02-18 19:51:25

1

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

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

可能会。

+0

对不起,但那也没用。谢谢。 – ant2009 2010-02-17 16:06:55

+0

'__FUNCTION__'不是一个宏,所以你不能有#ifdef。与'__func__'一样,它是编译器的关键字,或者不是。 – tomlogic 2010-02-17 16:24:55

+0

@tomlogic:是的,你说得对。我修好了它。 – sbi 2010-02-17 18:10:10

2

您应该可以在任何支持C99的编译器中使用没有任何显式宏的__func__

+1

是的,我可以在c89/c99中使用它。但是,visual studio 2008使用__FUNCTION__。我正在尝试#define,以便我可以在Windows和Linux上使用相同的宏。谢谢。 – ant2009 2010-02-17 15:55:45

6

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

#ifndef _MSC_VER 
#define __FUNCTION__ __func__ 
#endif 

还是其他方式,如果你喜欢:

#ifdef _MSC_VER 
#define __func__ __FUNCTION__ 
#endif 
+0

我试过了,仍然有相同的错误。我也尝试过这种情况(__MSVC__),并得到了同样的错误。还有更多建议。谢谢。 – ant2009 2010-02-17 16:04:42

+0

也许它是我的,但是当我尝试那些2时,我得到错误:“#if [n] def expected a identifer”。谢谢。 – ant2009 2010-02-17 16:13:46

+0

@robUK - 哎呀,原始代码让我陷入困境。固定。 – 2010-02-17 16:30:41