c++ - 实现编译检查以避免 C++ 中的嵌套作用域
问题描述
我有一个类 TransactionScope。它不支持嵌套事务,所以基本上我想阻止用户以嵌套的方式使用它。有什么方法可以实现编译检查以避免 C++ 中的嵌套范围。
一个正确的例子是
{
TransactionScope scope_0;
// user code...
}
{
TransactionScope scope_1;
// user code...
}
一个不正确的例子是
{
TransactionScope scope_0;
{
TransactionScope scope_1; // nested, incorrect
// user code...
}
// user code...
}
解决方案
据我所知,这是不可能的。
我不喜欢说某事是不可能的;有人可能会想出一个聪明的主意,从一个新的角度解决这个问题。然而,在这种情况下,有一种情况似乎确实注定了这个想法。(我认为不可能在所有情况下都可行;下面的仅说明了难度的开始范围。)
fun()
假设您在其中一个源文件中定义了一个有趣的函数。让我们假设这个定义大致如下:
void fun()
{
TransactionScope B;
// Do stuff
}
在不同的源文件中,假设您定义了以下函数。
void foo()
{
TransactionScope A;
// Do stuff
fun();
// Do more stuff
}
这使用TransactionScope
“嵌套方式”——对象B
是在A
. 然而,直到连接阶段才能知道这一事实。翻译单元的一个基本原则是它们是独立编译的。在处理包含 的定义的文件时foo
,编译器不知道 的内部结构fun
,反之亦然。直到链接器处理完所有目标文件,才有可能发现这种嵌套用法。
就链接器而言,一切都匹配。有一个调用void fun()
链接到具有匹配签名的定义。语言中没有任何东西可以根据上下文使此链接成为条件。所以链接器没有办法停止这个嵌套的事务范围。
推荐阅读
- python - functools 库的示例不可重现
- swift - SwiftUI:ViewBuilder 无法基于数组创建视图集合
- php - PHP/MySQL 请求:我不知道为什么 CREATE 不起作用
- swiftui - PassthroughSubject 中的 Never 是什么?
- java - 为什么串行算法比没有额外线程的并行版本慢?
- flutter - 检测软键盘上的手势
- bash - 奇怪的比较结果
- python - 在反向字符串函数上添加了额外的空间
- ios - 水平滚动视图滚动但仅部分滚动并反弹回原始位置
- php - 2019 如何使用 PHPMailer V6.0.7 和 PHP 从 Web 表单发送多个附件