在C ++ 11(使用最新的GCC)中是否有办法获取调用当前执行方法的方法(调用者)的名称或文件和行号?
我想在错误消息中使用此信息,例如,以下代码失败:
void SomewhereInMyProgram()
{
DoSomething(nullptr);
}
void DoSomething(const char* str)
{
Contract::Requires(str != nullptr);
// ...
}
目前我已准备好代码,用于报告DoSomething
中发生的错误。虽然这在技术上是正确的,但我希望它可以在SomewhereInMyProgram
中报告错误。这会让我的生活变得更轻松!
该解决方案可以使用任何C ++ 11功能,宏或GCC特定的东西,而不是我必须在每个呼叫站点添加的东西。
我认为堆栈跟踪会不帮助我,因为我无法使用异常处理。实际上,我非常有限:它是一个独立的环境,标准的C ++标头不可用。我希望得到某种宏观解决方案。
class Contract
{
public:
static void RequiresImpl(bool condition, const char* expression,
const char* file, int line);
#define Requires(condition) RequiresImpl(condition, #condition , \
__FILE__, __LINE__ )
};
答案 0 :(得分:5)
在宏中包裹DoSomething:
void DoSomethingImp(char const *, char const *file, char const *line)
{
// do whatever needed, use file and line to report problems
}
#define DoSomething(x) DoSomethingImp(x, __FILE__, __LINE__)
<强>声明:强>
这不是最好的事情,人们在以这种方式为ANSI或UNICODE定义的WIN API宏上尖叫。但我相信如果你不想改变对DoSomething的每一次调用,这是唯一的方法。
答案 1 :(得分:1)
据我所知,自动获取有关先前调用的信息的唯一方法是使用回溯。这篇文章有很多关于这样做的信息:
答案 2 :(得分:-3)
在gcc中,您可以使用以下某个宏:__PRETTY_FUNCTION__
或__FUNCTION__
或__func__
。