c++ - 堆栈上的匿名对象,在 C++ 中?

标签 c++

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

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

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

TraceObject 的构造函数将 this 压入每线程堆栈,析构函数再次将其弹出。因此可以查询堆栈以获取调用堆栈。

我对这项工作感到满意。然而,有一个小告密者:对象 to。根据设计,它永远不会被该名称引用。因此,它不需要一个名称,至少不需要可能与客户端使用的任何标识符冲突的名称(或者,在 _ 前缀的情况下,实现).

tl;dr

是否可以在堆栈上创建一个匿名、非临时对象(即在函数返回之前一直存在但没有标识符的对象),如果是,如何会做吗?

最佳答案

没有。

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

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


但是,有必要吗?

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

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

关于c++ - 堆栈上的匿名对象,在 C++ 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15518356/

相关文章:

c++ - 链接器无法找到函数,即使它们位于静态库中

c++ - VC2012错误C2676,VC2005错误C2784 : reverse_iterator for map of template classes

c++ - 如何在 Tensorflow bazel build 中包含 contrib op

c++ - 更改基本类型和类类型的返回值

c++ - 关于构造函数调用和继承顺序的一些困惑

c++ - C++ 中哪些地方实际需要尾随返回类型?

c++ - 为什么我可以覆盖 -(否定)和! (不是)但不是~(按位不是)?

c++ - 为什么 void{} 不存在?

c++ - 使用abi compliance checker时出错的原因是什么?

c++ - 空 std::queue 将数据推送到陈旧项目的末尾