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

How to print input c++ function parameter values automatically

本文关键字:函数 参数 c++ 何自动 打印 输入      更新时间:2023-10-16

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

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

应显示xy的值。

如果没有这种神奇的标准方式,是否有可能编写一个宏/模板来做到这一点?

——更新

根据@jxh的评论,如果在有问题的函数内部打印是不可能的宏/模板,是否有可能在调用方自动完成,如:

call(foo,x,y);

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

感谢

注:我正在使用gcc,(将来还会使用clang)。

我的看法:

#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

可变模板很有趣!

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

打印函数原型。