单行调试宏

One line debug macro

本文关键字:调试 单行      更新时间:2023-10-16

我想创建一个C++宏函数来调试,我希望它能像这样工作:

int main(){
    int a = 3, b = 5, c = 7;
    string s = "<";
    print(a,s,b);
    print(a,s,b,s,c);
}
OUTPUT:
3 < 5
3 < 5 < 7

我读过很多关于可变宏的文章,但我试图编写的任何代码都根本不起作用。

我曾想过使用lambda,但没有想出算法

我需要它就像一行代码,因为它只是用于调试,除此之外,我可以创建一个更复杂的函数,但我想这一定是可能的。。。

如果您同意将分隔符替换为'<<'(而不是','),则宏很容易定义(但请注意,print不是宏的好名称,这就是我适当重命名它的原因):

#include <iostream>
#include <string>
#ifdef DEBUG
#define DEBUG_PRINT(x) std::cout << x << std::endl
#else
#define DEBUG_PRINT(x)
#endif
int main(){
    int a = 3, b = 5, c = 7;
    std::string s = "<";
    std::cout << "START" << std::endl;
    DEBUG_PRINT(a << s << b);
    DEBUG_PRINT(a << s << b << s << c);
    std::cout << "END" << std::endl;
    return 0;
}

输出:

$ g++ -DDEBUG main.cpp && ./a.out
START
3<5
3<5<7
END
$ g++ main.cpp && ./a.out
START
END

您可以使用可变模板而不是MACRO:

template <typename ... Ts>
void print(Ts&&... args)
{
    int dummy[] = {0, ((std::cout << args), 0)...};
    static_cast<void>(dummy); // avoid warning for unused variable
    std::cout << std::endl;
}

或在c++17 中

template <typename ... Ts>
void print(Ts&&... args)
{
    (std::cout << ... << args) << std::endl;
}

我几乎实现了我想要的(用2行代码):

#define print(args...) {db,args; cerr<<endl;}
struct dbg{template<typename T> dbg& operator , (const T& v){cerr<<v<<" "; return *this; }} db;

现在我可以打印(1,2,"asjd"),它可以很好地进行