首页 > 解决方案 > 实现编译检查以避免 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...
}

标签: c++

解决方案


据我所知,这是不可能的。

我不喜欢说某事是不可能的;有人可能会想出一个聪明的主意,从一个新的角度解决这个问题。然而,在这种情况下,有一种情况似乎确实注定了这个想法。(我认为不可能在所有情况下都可行;下面的仅说明了难度的开始范围。)

fun()假设您在其中一个源文件中定义了一个有趣的函数。让我们假设这个定义大致如下:

void fun()
{
    TransactionScope B;
    // Do stuff
}

不同的源文件中,假设您定义了以下函数。

void foo()
{
    TransactionScope A;
    // Do stuff
    fun();
    // Do more stuff
}

这使用TransactionScope“嵌套方式”——对象B是在A. 然而,直到连接阶段才能知道这一事实。翻译单元的一个基本原则是它们是独立编译的。在处理包含 的定义的文件时foo,编译器不知道 的内部结构fun,反之亦然。直到链接器处理完所有目标文件,才有可能发现这种嵌套用法。

就链接器而言,一切都匹配。有一个调用void fun()链接到具有匹配签名的定义。语言中没有任何东西可以根据上下文使此链接成为条件。所以链接器没有办法停止这个嵌套的事务范围。


推荐阅读