Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 制作变量宏/方法,打印所有变量名称和值_C++_Macros_Variadic Templates_Variadic Macros - Fatal编程技术网

C++ 制作变量宏/方法,打印所有变量名称和值

C++ 制作变量宏/方法,打印所有变量名称和值,c++,macros,variadic-templates,variadic-macros,C++,Macros,Variadic Templates,Variadic Macros,现有宏在我的应用程序上获取可变数量的变量。 我想使用这个宏,以name=value格式打印这些变量 下面是一个小例子: #define EXISTING_MACRO(...) < ??? > int main() int a = 0; int b = 1; int c = 2; EXISTING_MACRO(a,b,c); 我试着从宏中调用一个变量模板函数,我成功地打印了变量值,但没有打印变量名称。(#x打印他们的地址,即使没有打印,也可能只显示方法变量名,'f'): #def

现有宏在我的应用程序上获取可变数量的变量。
我想使用这个宏,以
name=value
格式打印这些变量

下面是一个小例子:

#define EXISTING_MACRO(...) < ??? >

int main()
int a = 0;
int b = 1;
int c = 2;

EXISTING_MACRO(a,b,c);
我试着从宏中调用一个变量模板函数,我成功地打印了变量值,但没有打印变量名称。(
#x
打印他们的地址,即使没有打印,也可能只显示方法变量名,
'f'
):


#define SHOW(a)std::cout宏无法实现这一点。您可以对单个变量使用(
do{
..
}),而(0)
则很有用,这是因为)

#定义MYPRINT(VarName)do{\

std::cout您可以通过一点hack来做到这一点。hack不是很健壮,但是如果您将其用于调试目的,则应该可以接受

我们的想法是将整个变量宏参数字符串化,然后通过在逗号上标记来分离标签序列。这要求所有变量参数都不包含逗号,如果它们都是变量名,情况就是这样,但没有办法要求这样,事实上,下面建议的代码将乐于接受exp如图所示

#define SHOW(...) show(std::cout, #__VA_ARGS__, __VA_ARGS__)

template<typename H1>
std::ostream& show(std::ostream& out, const char* label, H1&& value) {
  return out << label << "=" << std::forward<H1>(value) << '\n';
}

template<typename H1, typename ...T>
std::ostream& show(std::ostream& out, const char* label, H1&& value, T&&... rest) {
  const char* pcomma = strchr(label, ',');
  return show(out.write(label, pcomma - label) << "="
                                               << std::forward<H1>(value)
                                               << ',',
              pcomma + 1,
              std::forward<T>(rest)...);
}
#定义SHOW(…)SHOW(std::cout,#u#u VA_ARGS,u_VA_ARGS_u)
模板
std::ostream&show(std::ostream&out,常量字符*标签,H1&值){

返回相关:也许更好的策略是使用调试程序。看起来您的
MYPRINT
与我的
SHOW
相同。其他选项目前不可用。谢谢!有一种方法可以使用QT qDebug而不是std::cout?@moia:看不出任何原因。但我没有尝试过。
#define SHOW(a) std::cout << #a << "=" << (a)

template<typename TF>
void write_err_output(std::ostream& out, TF const& f) {
    out << f << std::endl;
}

template<typename TF, typename ... TR>
void write_err_output(std::ostream& out, TF const& f, TR const& ... rest) {
    out << SHOW(f) << " ";
    write_err_output(out, rest...);
}
#define MYPRINT(VarName) do{ \
   std::cout << #VarName "=" << VarName << std::endl;} while(0)
#define SHOW(...) show(std::cout, #__VA_ARGS__, __VA_ARGS__)

template<typename H1>
std::ostream& show(std::ostream& out, const char* label, H1&& value) {
  return out << label << "=" << std::forward<H1>(value) << '\n';
}

template<typename H1, typename ...T>
std::ostream& show(std::ostream& out, const char* label, H1&& value, T&&... rest) {
  const char* pcomma = strchr(label, ',');
  return show(out.write(label, pcomma - label) << "="
                                               << std::forward<H1>(value)
                                               << ',',
              pcomma + 1,
              std::forward<T>(rest)...);
}