你可以使用一个恶意宏:
#define DUMP(a) \
do { std::cout << #a " is value " << (a) << std::endl; } while(false)
用法示例(
编辑现已更新为结构成员示例):
#include <iostream>
#define DUMPSTR_WNAME(os, name, a) \
do { (os) << (name) << " is value " << (a) << std::endl; } while(false)
#define DUMPSTR(os, a) DUMPSTR_WNAME((os), #a, (a))
#define DUMP(a) DUMPSTR_WNAME(std::cout, #a, (a))
struct S {
int a1;
float a2;
std::string a3;
std::ostream& dump(std::ostream& os)
{
DUMPSTR(os, a1);
DUMPSTR(os, a2);
DUMPSTR(os, a3);
return os;
}
};
int main()
{
S s = { 3, 3.14, " 03.1415926" };
s.dump(std::cout);
DUMP(s.a1);
DUMP(s.a2);
DUMP(s.a3);
return 0;
}
查看实时{{link1:CodePad上的演示}}
a1 is value 3
a2 is value 3.14
a3 is value 03.1415926
s.a1 is value 3
s.a2 is value 3.14
s.a3 is value 03.1415926
为什么使用有趣的宏?
回答未提出的问题。考虑一下,如果你将宏调用嵌套在条件语句或循环中会发生什么。
马歇尔·克莱恩解释了剩下的内容。
struct { std::string a; }
为例 - 你真的想要它打印出a._BUF[0] = 'H' a._BUF[1] = 'e' a._BUF[2] = 'l' , a._BUF[0] = 'l'
等等吗?还是你更想要a = "Hello, world\n"
?C++ 对于如何打印struct Foo
有一个明确的想法,那就是使用operator<<(std::ostream&, Foo);
。 - MSalters