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)...);
}