实现编译检查以避免C++嵌套范围
Implements Compilation Check to Avoid Nested Scope in 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()
的调用,该调用链接到具有匹配签名的定义。语言中没有任何内容可以根据上下文使此链接成为条件。因此,链接器无法停止此嵌套事务范围。
相关文章:
- 嵌套在类中时无法设置成员数据
- 无法访问嵌套类.类的使用无效
- 我正在使用嵌套的while循环来解析具有多行的文本文件,但由于某种原因,它只通过第一行,我不知道为什么
- 如何在C++中初始化嵌套类中的2个memeber
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- 在C++中搜索嵌套多映射值
- 在C++中将矢量转换为嵌套地图
- C++嵌套if语句,基本货币交换
- 在nlohmann json中,如何将嵌套对象的数组转换为嵌套结构的向量
- 嵌套的匿名命名空间
- 了解嵌套循环打印星号图案
- 如何使用boost::具有嵌套结构和最小代码更改的序列化
- 嵌套for循环C++的问题(初学者)
- 从嵌套在std::映射中的std::列表中删除元素的最佳方式
- 用C#中的并集模拟C++嵌套结构
- 部分专业化和嵌套模板
- 嵌套While循环不起作用(C++问题)
- C++-模板嵌套类的引用初始化无效
- 如何在嵌套类中正确使用友元声明?
- UE4 C++ 我无法将 JSON 嵌套值获取到 TArray