防止在宏中定义的匿名变量的解构,直到范围结束
Preventing deconstruction of anonymous variable defined in macro until end of scope
我正在尝试通过RAII IDIOM在日志文件中代表和格式化类构造函数和解构器。使用单个#define
,它打印" {"并增加了全局压痕级别,以便在该压痕级别打印下一个记录线。
LogScopeRAII
应该在Foo()
的末尾自然地打印"}",并自然降低全局压痕级别。但是,我看到的行为是logscoperaii在构造后立即被解构。
假设:我认为问题是在分配的RHS上创建了LogScoperaii(因此是匿名的?),并且在行结尾被销毁,但我不是当然该怎么办。我以为VSCOPE_F
中的LOG_ANONYMOUS_VARIABLE
会做到这一点并导致它坚持下去,但不是。
问题:如何停止logScoperaii被解构直到调用功能范围范围范围?
?/* Header */
LogScopeRAII::LogScopeRAII(Verbosity verbosity, const char* file, unsigned line, const char* format, ...)
{
// ...
// print "{" and then increase an indentation global var
}
LogScopeRAII::~LogScopeRAII()
{
// ...
// print "}" and then decrease the indentation global var
}
#define LOG_ANOMYMOUS_VARIABLE(str) LOG_CONCAT(str, __LINE__)
#define VSCOPE_F(verbosity, ...)
LogScopeRAII LOG_ANONYMOUS_VARIABLE(raii) =
((verbosity) > verb_cutoff() ? LogScopeRAII() : LogScopeRAII{verbosity, __FILE__, __LINE__, __VA_ARGS__}
#define SCOPE_F(verbosity_name, ...) VSCOPE_F(Verbosity_ ## verbosity_name, __VA_ARGS__)
#define SCOPE_FUNCTION(INFO) SCOPE_F(verbosity_name, __FUNCTION__)
/* Implementation */
void Foo()
{
SCOPE_FUNCTION(INFO) // print "{" and increase indentation
for (size_t i = 0; i < 3; ++i)
{
// do work
LOG(INFO, "Work logged");
}
// print "}" and decrease indentation
}
所需的输出:
{ Foo()
"Work Logged" // Note indentation
} 0.23 s: Foo()
编辑:将问题归为
它的症结在于:三元式似乎不起作用。
这有效:
LogScopeRAII a(LogScopeRAII{ Verbosity_INFO, __FILE__, static_cast<unsigned>(__LINE__), "" });
但这不是:
LogScopeRAII a(((Verbosity_INFO) > indent) ? LogScopeRAII() : LogScopeRAII{ Verbosity_INFO, __FILE__, static_cast<unsigned>(__LINE__), "" });
我得到:
{
}
Work logged
Work logged
Work logged
}
constructCounter: 1
destructCounter: 2
Exiting...
#define VSCOPE_F(verbosity, ...)
LogScopeRAII LOG_ANONYMOUS_VARIABLE(raii) =
((verbosity) > verb_cutoff() ? LogScopeRAII() : LogScopeRAII{verbosity, __FILE__, __LINE__, __VA_ARGS__}
应该是
#define VSCOPE_F(verbosity, ...)
LogScopeRAII LOG_ANONYMOUS_VARIABLE(raii)
(((verbosity) > verb_cutoff() ? LogScopeRAII() : LogScopeRAII{verbosity, __FILE__, __LINE__, __VA_ARGS__})
否则,您使用临时变量的复制构造函数。
(您也可能会修复移动构造者和驱动器以允许您当前的宏)
相关文章:
- 为什么在全局范围内使用"extern int a"似乎不行?
- 尝试通过多个向量访问变量时,向量下标超出范围
- 错误:未在此范围内声明'reverse'
- 正在将指针转换为范围
- 如何使用 AWS C++ 开发工具包在给定的开始和结束日期范围内列出 S3 中的文件
- 是否可以在基于范围的 for 循环中使用模板化的开始/结束方法
- 防止在宏中定义的匿名变量的解构,直到范围结束
- 如何创建从开始和结束迭代器的范围
- 指针范围结束后,C 在堆上访问对象
- 在Ubuntu上使用C 中的pthreads时.主线程范围从哪里开始和结束
- 范围之后的交易结束
- 将remove_copy_if与ostream_iterator一起使用时确定复制范围的结束
- 可以基于范围的循环知道结束
- 无法使用非成员开始和结束函数写入基于范围
- 为什么析构函数在对象引用作为参数传递时函数范围结束后调用
- 在范围结束后提升共享指针"runtime error"
- 变量未传递低谷(可能是范围的结束)
- 如何在创建范围结束时自动从单一实例管理器类中删除shared_ptr
- 使用async结束线程并超出其未来的范围是否安全?
- Vector迭代器+偏移量超出范围,在while循环结束时给出错误