在C++宏中的包装方法

问题描述:

在我的框架中,我想知道调用者客户端代码的行号,文件路径和方法名称。因此,例如,框架有一个方法B(),客户端使用框架并在X行,文件路径Y调用B()。对于我来做一些错误报告,我想知道X和Y.在C++宏中的包装方法

明显解决方案是将B()包含在一个宏中:

#define B() B(__LINE__, __FILE__, ...)这样客户端就不必指定__LINE__和__FILE__宏。

这是一个很好的设计选择,如果没有,如何做到这一点的好方法?

+0

这并不罕见,特别是报告与源代码位置相关的日志信息。 – WhozCraig

+0

@WhozCraig那么常见的是什么? – ibe

+1

也许具体的否定将你抛弃? “并不罕见”=不常见=常见。换句话说,你正在做的是通常完成的。 – WhozCraig

你的方法可能是好的,但如果你必须做出很多这样的方法,你可能要考虑一种替代方案:

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

这种方法更好,因为你只需要一个宏就可以完成任何事情。你可以选择一个名字来减少干扰任何事情的机会。 –