在C++宏中的包装方法
问题描述:
在我的框架中,我想知道调用者客户端代码的行号,文件路径和方法名称。因此,例如,框架有一个方法B(),客户端使用框架并在X行,文件路径Y调用B()
。对于我来做一些错误报告,我想知道X和Y.在C++宏中的包装方法
明显解决方案是将B()
包含在一个宏中:
#define B() B(__LINE__, __FILE__, ...)
这样客户端就不必指定__LINE__和__FILE__宏。
这是一个很好的设计选择,如果没有,如何做到这一点的好方法?
答
你的方法可能是好的,但如果你必须做出很多这样的方法,你可能要考虑一种替代方案:
struct Location {
const char *file;
int line;
};
#define LOC (Location{__FILE__,__LINE__})
struct Framework {
void B(const Location &);
};
//客户端代码
Framework f;
f.B(LOC);
如果你有像B这样的很多方法,这就减少了需要编写的宏的数量,以便使客户端代码更加单调乏味。你必须权衡权衡。
+0
这种方法更好,因为你只需要一个宏就可以完成任何事情。你可以选择一个名字来减少干扰任何事情的机会。 –
这并不罕见,特别是报告与源代码位置相关的日志信息。 – WhozCraig
@WhozCraig那么常见的是什么? – ibe
也许具体的否定将你抛弃? “并不罕见”=不常见=常见。换句话说,你正在做的是通常完成的。 – WhozCraig