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";