如何确定此预处理器宏是否存在?

时间:2010-10-28 06:38:54

标签: c++ macros c-preprocessor

我想知道如何确定预处理器宏__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
}

另一种方法是按照其他人的建议检查编译器。

1 个答案:

答案 0 :(得分:4)

您可能必须知道您正在使用哪个编译器。对于GCC(GNU编译器集合),您可能会测试:

#ifdef __GNUG__
...use __PRETTY_FUNCTION__
#endif

如果你知道哪一个引入了这个功能,你可能会检查编译器版本,并且你有使用旧版本编译代码的任何危险。

GCC(4.4.1)手册说:

  

在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__一直是变量。