【发布时间】:2020-06-15 18:55:35
【问题描述】:
我有一个用于记录的宏,我想在宏中定义一个临时记录,如下所示:
#define MACRO_LOG(...) \
temprecord t; \
logger->logmessage(__VA_ARGS___);
使用temprecord() { logger->increaseIndent() } 并在析构函数中使用decreaseIndent()。
与名称的关联(例如,变量) 给出一个控制其生命周期的对象范围。通过不命名 对象,它的生命周期是绑定的
来源 Why do un-named C++ objects destruct before the scope block ends?
因为 temprecord 具有范围的生命周期,如果我有的话
{
MACRO_LOG("stackoverflow example");
MACRO_LOG("stackoverflow example");
}
在范围之外,我将有 0 缩进,在范围 1 和 2 缩进。 但是,当我命名我的 temprecord 时,我会重新定义变量名。如果我不声明它,我就得不到我想要的范围。
如何解决这个问题?我想用一个容器来放临时记录,但似乎无法解决这个难题..
我希望完成的是在我提到的范围内的双缩进,而不是 MACRO_LOG 范围内的单缩进。
【问题讨论】:
-
如果您观察到使用宏等同于将宏的内容直接插入到它被引用的位置,并且如果您使用笔和纸进行计算,这在您的示例中意味着什么,原因因为你的重复符号错误变得非常明显,以及它的简单解决方案。
标签: c++ variables scope macros anonymous