如何自动打印输入c ++函数参数值

时间:2014-07-25 06:51:09

标签: c++ gcc clang

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

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

应显示xy的值。

如果标准方式没有这样的魔法,是否可以编写宏/模板来执行此操作?

- 更新 -

Per @jxh的评论,如果使用宏/模板无法在相关函数内打印,是否可以在调用者端自动执行,如下所示:

call(foo,x,y);

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

由于

P.S。我正在使用gcc,(以及将来也会使用)。

2 个答案:

答案 0 :(得分: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

Variadic模板很有趣!

答案 1 :(得分:0)

没有用于打印参数的宏,但您可以使用__PRETTY_FUNCTION__宏打印函数原型