实现编译检查以避免C++嵌套范围

Implements Compilation Check to Avoid Nested Scope in C++

本文关键字:C++ 嵌套 范围 编译 检查 实现      更新时间:2023-10-16

>我有一个类 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()的调用,该调用链接到具有匹配签名的定义。语言中没有任何内容可以根据上下文使此链接成为条件。因此,链接器无法停止此嵌套事务范围。