8

当我使用__FUNCTION__宏/变量打印出调试信息时,使用 Microsoft C++ 编译器和 gcc 时输出的内容似乎有所不同。例如,使用以下简单代码:

class Foo 
{
    public:
       void Bar(int a, int b, int c)
       {
           printf ("__FUNCTION__ = %s\n", __FUNCTION__);
       }
};

int main (void)
{
    Foo MyFoo;

    MyFoo.Bar();

    return 0;
}

使用 Microsoft Visual C++ 编译器,我得到

__FUNCTION__ = Foo::Bar

而在使用 gcc 编译时(在这种情况下是在 Mac 上),我得到

__FUNCTION__ = Bar

第二个例子并不理想,因为我经常有几个类,比如Init()Uninit()方法,并且在调试输出跟踪中几乎不可能分辨出其中哪一个已被调用,因为类名将丢失。现在,我知道你可以使用__PRETTY_FUNCTION__in__FUNCTION__来获得类似的东西

__PRETTY_FUNCTION__ = void Foo::Bar(int, int, int)

这很好,但是对于我需要的东西来说它有点过于冗长,并且对于有很多参数的函数来说有点长。

所以我的问题是(最后),有没有办法让输出看起来像简单地Foo::Bar使用 gcc,就像上面的例子一样?

4

2 回答 2

3

如果您使用它进行跟踪,您可以随时使用typeid(T).name()并按平台有条件地编译。当然不如宏方便,但它可以工作。

有点类似于C++ 中的 __CLASS__ 宏

于 2011-10-04T15:10:57.167 回答
2

标准认可的函数名定义如下:

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

例子:

#include <iostream>

namespace meh {
    void foobar() { std::cout << __func__ << std::endl; }
};

struct Frob {
    void foobar() { std::cout << __func__ << std::endl; }
    static void barfoo() { std::cout << __func__ << std::endl; }
};

int main () {
    std::cout << __func__ << std::endl;
    meh::foobar();
    Frob().foobar();
    Frob::barfoo();
}

但是,使用 g++ 输出:

main
foobar
foobar
barfoo

但是,这是有效的 C++ 行为:

§ 8.4.1, 8:函数局部预定义变量__func__被定义为好像static const char __func__[] = "function-name "; 已经提供了表单的定义,其中 function-name 是实现定义的字符串。未指定此类变量的地址是否与程序中任何其他对象的地址不同

即,您可能不相信它的价值。如果您想使用不可移植的扩展,请查看类似的问题:__PRETTY_FUNCTION__、__FUNCTION__、__func__ 之间有什么区别?.

于 2011-10-04T15:10:19.243 回答