8

我正在开发一个日志/跟踪单元(请不要指向现有的,这是为了体验和结果)。

要获得运行时调用堆栈跟踪,想法是首先构造一个TraceObject实例,一个函数被输入,它携带当前类和函数的信息。有点类似于:

TraceObject to( "MyClass", "myClassFunction" );

TraceObjectthis入每个线程堆栈的构造函数,析构函数再次弹出它。因此可以在堆栈中查询调用堆栈。

我对这个工作感到满意。但是,有一个小告密:对象to。按照设计,它永远不会被这个名称所指。因此,它不需要一个名称,尤其是可能与客户端使用的任何标识符(或者,在_前缀的情况下,实现)冲突的名称。

tl;博士

是否可以在堆栈上创建一个匿名的非临时对象(即,一个将一直存在到函数返回但没有标识符的对象),如果是,它将如何完成?

4

3 回答 3

5

不。

C++ 中有匿名对象,它们是表达式结果的临时对象,但它们只存在于它们所在的语句的上下文中。

如果你真的试图声明一个匿名对象,你会混淆解析器,它会认为你在声明......一个函数!


但是,有必要吗?

如果您接受使用宏来实际声明TraceObject,那么为每个跟踪使用宏就很简单;从而在那里提供类和功能。使用__func__或等效项,您可以提取类名和函数名(需要一些字符串解析,取决于编译器)并从那里开始工作。

当然,无论如何,您都会为每个跟踪使用一个宏,因为您可能需要文件名和行号!

于 2013-03-20T08:29:35.077 回答
3

正如我在评论中所说,不能使用范围受限的匿名变量。

#define BEGIN_LOG   TraceObject abcdefghij( "", __func__ );

void Function(){
    BEGIN_LOG;

    //bla bla

}

应该这样做,前提是有一个编译器宏来获取类名。

编辑:没有运气通过简单的方法获取类名,您可能需要执行类似于Class name macro建议的操作。或者只是凑合着__FILE__

编辑:您可能想尝试查看__func__其中__FUNCTION__一个或两个是否按您希望的方式工作。也没有指定 C++ 标准。

于 2013-03-20T08:21:45.693 回答
1

一些行号的东西:

#define XPASTE(arg1, arg2) PASTEX(arg1, arg2)
#define PASTEX(arg1, arg2) arg1 ## arg2
#define TRACELOG() \
            TraceObject XPASTE(trace_object,  __LINE__)
于 2013-03-20T08:42:41.403 回答