我正在编写一个从文件中读取结构的程序。出于调试目的,如果我可以有一个编译时切换来打印读取的所有内容的名称和值,这将是非常方便的,可以在生产版本中禁用它们以获得更好的性能/代码大小。在 C 中,我可以使用这样的预处理器来完成此操作:
#ifdef DEBUG
#define READ(name, in) { name = read(in); printf("#name: %d\n", name); }
#else
#define READ(name, in) { name = read(in); }
#endif
void myreader(mystream_t *in)
{
int a, b, c;
READ(a, in);
READ(b, in);
READ(c, in);
}
有什么办法可以重现这个结构吗?我想过这个:
private static final boolean DEBUG_ENABLED = true;
private int debugRead(MyInputStream in, String name) {
int val = in.read();
if (DEBUG_ENABLED) {
System.out.println(String.format("%s: %d", name, val));
}
return val;
}
public MyReader(MyInputStream in) {
int a, b, c;
a = debugRead(in, "a");
b = debugRead(in, "b");
c = debugRead(in, "c");
}
但是,这需要我输入所有变量的名称两次,并且即使在发布版本上也要存储与所有名称对应的字符串。有更好的方法吗?
编辑:我最担心的是代码冗长。我想要的最后一件事是让我的代码杂乱无章的调试/打印/跟踪语句,这些语句掩盖了实际的读取逻辑。