如何使用gcc模仿Microsoft版本的__FUNCTION__?

时间:2011-10-04 15:01:40

标签: c++ windows macos gcc compiler-construction

当我使用__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__代替__FUNCTION__来获得类似

的内容
__PRETTY_FUNCTION__ = void Foo::Bar(int, int, int)

哪个好,但它对于我需要的东西有点过于冗长,并且对于具有大量参数的函数来说有点长。

所以我的问题是(最后),有没有办法让输出看起来像Foo::Bar使用gcc,如上例所示?

2 个答案:

答案 0 :(得分:3)

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

__CLASS__ macro in C++

模糊地相似

答案 1 :(得分: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是实现定义的字符串。未指定此变量的地址是否与程序中任何其他对象的地址不同

是的,你可能不相信它的价值。如果您想使用非便携式扩展程序,请查看类似的问题:What's the difference between __PRETTY_FUNCTION__, __FUNCTION__, __func__?