单行调试宏 < >我想创建一个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 intmain(){ INTA=3,b=5,c=7; string s=“

单行调试宏 < >我想创建一个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 intmain(){ INTA=3,b=5,c=7; string s=“,c++,macros,C++,Macros,如果您同意用“替换分隔符如果您同意用“替换分隔符,您可以使用可变模板而不是宏: template <typename ... Ts> void print(Ts&&... args) { int dummy[] = {0, ((std::cout << args), 0)...}; static_cast<void>(dummy); // avoid warning for unused variable std::co

如果您同意用“
替换分隔符如果您同意用“
替换分隔符,您可以使用可变模板而不是宏:

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;
}
模板
无效打印(Ts&…参数)
{

int dummy[]={0,((std::cout您可以使用可变模板而不是宏:

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;
}
模板
无效打印(Ts&…参数)
{

int dummy[]={0,((std::cout我几乎实现了我想要的(有两行代码):


#define print(args…{db,args;cerr我几乎实现了我想要的(有两行代码):


#define print(args…{db,args;cerrA宏不能涉及运行时类型,例如
std::string
。lambda也是一种运行时类型。宏用于预处理,在任何编译之前,不要管运行时。char*?或非字符串的单词,例如print(abc)呢如果abc可以像#abcIf
abc
一样处理,那么它就是来自预处理器的东西。
char*
也不能这样做。
int
也不能从预处理器访问。你可以编写一些分析程序来计算特定时间段的变量值在程序执行过程中,或仅使用调试器或运行时工作的东西。C预处理器有其局限性。这是一个很好的选择,在这里可能会派上用场。宏不能包含运行时类型,如
std::string
。lambda也是运行时的东西。宏用于在任何编译之前进行预处理,别管运行时了。char*?或者不是字符串的单词呢,例如print(abc)如果abc可以像#abcIf
abc
一样处理,那么它就是来自预处理器的东西。
char*
也不能这样做。
int
也不能从预处理器访问。你可以编写一些分析程序来计算特定时间段的变量值在程序执行过程中,或者只使用调试器或运行时工作的东西。C预处理器有其局限性。这是一个很好的替代方法,可能会在这里派上用场。您甚至可以在C++11之后在块内声明和定义结构(从而删除全局)。你的意思是我可以在de宏中声明结构?如何?事实上,你可以在函数中声明局部结构,但不能在模板方法中声明,所以我错了。:/你甚至可以在C++11之后在块中声明和定义结构(从而移除全局)。你的意思是我可以在de宏中声明结构?如何?事实上,你可以在函数中声明局部结构,但不能在模板方法中声明,所以我错了。:/
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;
}
template <typename ... Ts>
void print(Ts&&... args)
{
    (std::cout << ... << args) << std::endl;
}
#define print(args...) {db,args; cerr<<endl;}
struct dbg{template<typename T> dbg& operator , (const T& v){cerr<<v<<" "; return *this; }} db;