创建可变宏/方法,打印所有变量的名称和值
Make variadic macro / method which prints all variables names and values
一个已经存在的宏在我的应用程序中获取可变数量的变量。
我想用这个宏,用name=value
格式打印这些变量。
下面是一个小例子:
#define EXISTING_MACRO(...) < ??? >
int main()
int a = 0;
int b = 1;
int c = 2;
EXISTING_MACRO(a,b,c);
输出应该是:
a=0, b=1, c=2
我已经尝试过从宏中调用可变模板函数,并且我确实成功打印了变量值,但没有打印变量名称。(#x
打印它们的地址,即使它不打印,它也可能只显示方法变量名,'f'
):
#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...);
}
您可以通过一些技巧来做到这一点。这个hack不是很健壮,但是如果您将它用于调试目的,它应该是可以接受的。
思路是将整个可变宏参数字符串化,然后通过逗号进行标记,将标签序列分开。这要求所有可变参数都不包含逗号,如果它们都是变量名,则会出现这种情况,但没有办法要求这样做,实际上下面建议的代码将愉快地接受表达式,如所示。
#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)...);
}
(live on coliru)
为简单起见,并避免使用std::string
,我使用了标准的C strchr
函数而不是c++库函数。我向所有被冒犯的人道歉。
对于宏不能这样做。您可以对单个变量(do{
…因此,}while(0)
很有用)。
#define MYPRINT(VarName) do{
std::cout << #VarName "=" << VarName << std::endl;} while(0)
则使用MYPRINT(x)
;你可以考虑定义MYPRINT1
…MYPRINT19
(可能是自动的,通过一些脚本)用于范围1到19。
如果使用最新的GCC,您可以使用MELT根据您的目的定制它,但我认为这不值得这样做(您将花费数周的时间来做这件事)。
你可以考虑用一些其他的预处理器(如gpp)或一些简单的脚本(如awk
)预处理你的c++代码
相关文章:
- 打印所有继承的类成员变量和方法
- 为什么我的字符串变量没有打印完整的字符串?
- 从模板创建通用打印函数,以打印基元数据类型变量的值
- 在我的变量打印C++后无法获得 $ 打印符号
- 为自定义打印调试实现传递任何类型的变量
- std::cout 在打印变量与函数表达式时的行为不同
- 打印类中的变量
- 如何在循环中使用scanf,将值存储到一个变量中,然后打印出来?
- 为什么变量的打印地址在每次执行时都会打印随机值,即使它是 C 中的逻辑地址?
- 使用更改此变量的函数在同一行中打印引用变量
- 如何让m_refcount变量打印出我想要的值而不是垃圾
- 面临在 if 语句之外打印变量数据的问题 完成使用 Qt 编程
- 错误:变量或字段'PrintEntity'声明无效无效打印实体(实体 e);
- 使用指针变量打印特定的数组变量
- 使用自动变量打印矢量的内容
- void 函数使用相同的变量打印两个不同的答案
- 为什么字符串变量打印与垃圾
- cout<<变量;打印出空白
- 为什么未初始化的变量打印一个奇怪的负值
- 当一个变量打印未初始化的变量contain时,在C++中该怎么办