我正在开发一个记录/跟踪单元(请不要指向现有的,这是为了体验,也是为了结果)。
要获得运行时调用堆栈跟踪,其思想是首先构造一个 TraceObject
实例进入函数,它携带当前类和函数的信息。有点类似于:
TraceObject to( "MyClass", "myClassFunction" );
TraceObject
的构造函数将 this
压入每线程堆栈,析构函数再次将其弹出。因此可以查询堆栈以获取调用堆栈。
我对这项工作感到满意。然而,有一个小告密者:对象 to
。根据设计,它永远不会被该名称引用。因此,它不需要有一个名称,至少不需要可能与客户端使用的任何标识符冲突的名称(或者,在 _
前缀的情况下,实现).
tl;dr
是否可以在堆栈上创建一个匿名、非临时对象(即在函数返回之前一直存在但没有标识符的对象),如果是,如何会做吗?
最佳答案
没有。
C++ 中有匿名对象,临时对象是表达式的结果,但它们仅存在于它们所在语句的上下文中。
如果你真的试图声明一个匿名对象,你会混淆解析器,它会认为你正在声明......一个函数!
但是,有必要吗?
如果您接受使用宏来实际声明 TraceObject
,那么为每个跟踪使用宏就很简单;从而在那里提供类和函数。使用 __func__
或等价物,您可以提取类名和函数名(需要一些字符串解析,取决于编译器)并从那里开始工作。
当然,无论如何您都会为每个跟踪使用一个宏,因为您可能需要文件名和行号!
关于c++ - 堆栈上的匿名对象,在 C++ 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15518356/