C++ 为什么#ifndef uu func_u_u_u_u_u_______________________?

C++ 为什么#ifndef uu func_u_u_u_u_u_______________________?,c++,func,C++,Func,以下代码 #include <iostream> #ifndef __func__ # ifdef __FUNCTION__ # define __func__ __FUNCTION__ # else //# error This compiler supports neither __func__ nor __FUNCTION__ # endif #endif int main(int argc, char **argv) { st

以下代码

#include <iostream>

#ifndef __func__
#   ifdef __FUNCTION__
#       define __func__ __FUNCTION__
#   else
//#       error This compiler supports neither __func__ nor __FUNCTION__
#   endif
#endif


int main(int argc, char **argv)
{
    std::cout << __func__ << std::endl
              << __FUNCTION__ << std::endl
              << __PRETTY_FUNCTION__ << std::endl;
}

但是,如果我取消注释
else
条件,编译将失败,因为既没有定义
\uuuuu func\uuuu
也没有定义
\uuu函数。这怎么可能?从上面的输出中可以清楚地看到它们的定义。关于
#ifdef
/
#ifndef
是否有一些简单的原则我在这里遗漏了?

不是宏。它是一个神奇的变量,就像
\uuuuu函数\uuuuu
\uuu漂亮的函数\uuuu
一样

发件人:

GCC提供了三个神奇的变量,它们以字符串形式保存当前函数的名称。第一个是
\uuu func\uu
,它是C99标准的一部分:

标识符
\uuuu func\uuuu
由转换器隐式声明,就好像在每个函数定义的左括号后面,声明

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

\uuuu FUNCTION\uuuu
\uuuu func\uuuu
的另一个名称

在C语言中,
\uu PRETTY\u FUNCTION\uu
\uu func\uu
的另一个名称。但是,在C++中,<>代码>
我不知道,也许func和朋友不是宏,你能告诉我你使用的是什么编译器和操作系统吗?我使用的是基于GCC/G++4.7.2的交叉编译器。使用Visual Studio 2010时,代码不会产生此错误。我只是在交叉编译时才看到这个问题。谢谢,我说它们不是预处理器宏,而是编译器内置的。它们是中的宏和中的变量。你应该检查是否存在编译器识别宏(
\uuu GNUC\uuuu
\u MSC\u VER
),而不是
\uu func\uu
\uu FUNCTION\uuu>。
 static const char __func__[] = "function-name";