我想知道如何确定预处理器宏__PRETTY_FUNCTION__
是否可以与给定的编译器一起使用(因为它应该是非标准的)。如何在头文件中检查这个?我想做的是:
#ifndef __PRETTY_FUNCTION__
#define __PRETTY_FUNCTION__ __func__
#endif
但是,我猜测会发生什么事情是预处理器为每个函数定义了宏,所以我想知道__PRETTY_FUNCTION__
(不同于__FILE__
或__LINE__
)是否有任何意义一个功能。这是真的还是我可以使用上面的代码?如果没有,我该如何检查?
__PRETTY_FUNCTION__
(我没有在类中检查)。所以必须有另一种方式。
EDIT2:实际上,一个简单的黑客就是这样做:):
void Dummy()
{
#ifndef __PRETTY_FUNCTION__
#define __PRETTY_FUNCTION__ __func__
#endif
}
另一种方法是按照其他人的建议检查编译器。
答案 0 :(得分:4)
您可能必须知道您正在使用哪个编译器。对于GCC(GNU编译器集合),您可能会测试:
#ifdef __GNUG__
...use __PRETTY_FUNCTION__
#endif
如果你知道哪一个引入了这个功能,你可能会检查编译器版本,并且你有使用旧版本编译代码的任何危险。
在C中,
__PRETTY_FUNCTION__
是__func__
的另一个名称。但是,在C ++中,__PRETTY_FUNCTION__
包含函数的类型签名及其裸名称。 例如,这个程序:extern "C" { extern int printf (char *, ...); } class a { public: void sub (int i) { printf ("__FUNCTION__ = %s\n", __FUNCTION__); printf ("__PRETTY_FUNCTION__ = %s\n", __PRETTY_FUNCTION__); } }; int main (void) { a ax; ax.sub (0); return 0; }
给出了这个输出:
__FUNCTION__ = sub __PRETTY_FUNCTION__ = void a::sub(int)
这些标识符不是预处理器宏。在GCC 3.3及更早版本中,仅在C中,
__FUNCTION__
和__PRETTY_FUNCTION__
被视为字符串文字;他们可以使用 初始化char数组,它们可以与其他字符串文字连接。 GCC 3.4及以后将它们视为变量,如__func__
。在C ++中,__FUNCTION__
和__PRETTY_ FUNCTION__
一直是变量。