2014-07-25 116 views
3

我想知道是否有宏或标准方式(用于调试目的)自动打印函数f的参数值,就像__FUNCTION__打印/显示函数签名?例如,如何自动打印输入C++函数参数值

void foo(int x, string y) { 
    cout << __FUNCTIION_ARGS__ << endl; 
} 

应显示x,并y值。

如果没有这样的魔法标准方式,是否可以编写一个宏/模板来做到这一点?

--Update--

每@ JXH的评论,如果有问题的函数内部打印是不可能的宏/模板,是可以自动去做就呼叫侧,喜欢的东西:

call(foo,x,y); 

它打印每个参数值,并且表现与foo(x,y)仿佛它是在每一个其他方面直接调用相同?如果某个值不可打印(例如指针,函数),则包装call只能打印一个不透明的值,如<ptr><noprint>

谢谢

P.S.我正在使用gcc,(并且在将来也会发出叮当声)。

+0

总之,没有。像在过去的美好时代一样用手写字。 –

+0

请注意'__PRETTY_FUNCTION__'不是标准的C++(我认为?),它是一个至少由* gcc *支持的preproosessor扩展,也是由* clang *我相信(但不同的输出?)。您可能想要指定您正在使用的编译器(编辑问题以添加标记)。 – hyde

+0

@hyde谢谢。建议编辑。 – tinlyx

回答

0

有打印参数没有宏,但你可以使用它的__PRETTY_FUNCTION__宏观

2

我拿打印的函数原型:

#include <iostream> 

// Dummy parameter-pack expander 
template <class T> 
void expand(std::initializer_list<T>) {} 

// Fun 
template <class Fun, class... Args> 
typename std::result_of<Fun&&(Args&&...)>::type 
call(Fun&& f, Args&&... args) { 

    // Print all parameters 
    std::cout << "Params : "; 
    expand({(std::cout << args << ' ', 0)...}); 
    std::cout << '\n'; 

    // Forward the call 
    return std::forward<Fun>(f)(std::forward<Args>(args)...); 
} 

// Random test function 
int myFunc(std::string const &s, double d, int i) { 
    std::cout << s << ' ' << d << ' ' << i << '\n'; 
    return 57; 
} 

int main() 
{ 
    // Painless call 
    std::cout << call(myFunc, "hello", 3.14, 42) << '\n'; 

    return 0; 
} 

输出:

Params : hello 3.14 42 
hello 3.14 42 
57 

可变参数模板很有趣!

+0

您可以避免使用http://ideone.com/iOcMGj – Davidbrcz

+0

@Davidbrcz扩大诀窍,实际上这正是我以前的看法(请参阅编辑)。我假设一个无操作函数比递归函数更容易编译器优化。 – Quentin

+0

在这一点上,我不在乎优化。我关心代码的可读性。而你的诀窍使得代码可读性差得多 – Davidbrcz