__func__和__PRETTY_FUNCTION__之间的东西?

时间:2014-04-22 20:54:39

标签: c++ gcc macros

我使用g ++ 4.8.1并使用这两个宏进行调试。但是,__func__宏只给出了函数名称,如果在不同的类中有许多具有相同名称的函数,则可能会产生误导。 __PRETTY_FUNCTION__宏生成整个函数签名 - 返回类型,类名和所有参数,可能很长。

我希望在它之间有一些东西 - 一个宏,它只给我一个类名和函数名。有什么方法可以达到这个目的吗?

2 个答案:

答案 0 :(得分:4)

this的启发,我创建了以下宏__COMPACT_PRETTY_FUNCTION__

std::string computeMethodName(const std::string& function, const std::string& prettyFunction);

#define __COMPACT_PRETTY_FUNCTION__ computeMethodName(__FUNCTION__,__PRETTY_FUNCTION__).c_str() //c_str() is optional


std::string computeMethodName(const std::string& function, const std::string& prettyFunction) {
    size_t locFunName = prettyFunction.find(function); //If the input is a constructor, it gets the beginning of the class name, not of the method. That's why later on we have to search for the first parenthesys
    size_t begin = prettyFunction.rfind(" ",locFunName) + 1;
    size_t end = prettyFunction.find("(",locFunName + function.length()); //Adding function.length() make this faster and also allows to handle operator parenthesys!
    if (prettyFunction[end + 1] == ')')
        return (prettyFunction.substr(begin,end - begin) + "()");
    else
        return (prettyFunction.substr(begin,end - begin) + "(...)");
}

它的作用:

  • 需要__PRETTY_FUNCTION__
  • 删除返回类型和所有参数
  • 如果函数的参数为​​零,则会附加(),否则为(...)

特点:

  • 处理名称空间,构造函数等
  • 也适用于括号运算符!

限制:

  • 仅适用于gcc
  • 在运行时而不是编译时创建
  • 分配了堆。
  • 对lambdas不起作用,__FUNCTION__ and __PRETTY_FUNCTION__ don't match ...我几乎把它称为编译器bug :)
    • __FUNCTION__看到operator()
    • __PRETTY_FUNCTION__看到<lambda(...)>

答案 1 :(得分:1)

不幸的是,我认为这不容易做到。我是那些不明白为什么没有人提出实现__CLASS__宏的人之一,可以扩展到当前类,例如all the macros defined by GCC

我同意这些宏在一些困难的调试情况下有很大的帮助。可能很难实施。