c++ - 编译时检查连续函数调用

标签 c++ compiler-errors

假设我们有这样一个类:

class OProcess {
  ...
  void Process1();
  void Process2(); // call only if Process1 wasn't called
  ...
}

这样当函数 Process1() 尚未被调用时,函数 Process2() 可以被调用。

有没有办法检查在编译时是否正确使用了 Process 类? 即如果可以在 Process2() 之前为 OProcess 对象的某些实例调用 Process1(),编译器必须给出错误。

附言我知道可以有这样的代码:

 if (variable == 1000)
   Process1();
 Process2();

并且编译器无法确定 Process1() 将在 Process2() 之前被调用。但是这里的编译器可以确保 Process1() 可以在 Process2() 之前为某些变量值调用。我需要它来出错或至少发出警告。

最佳答案

简短的回答是有点


长答案是:C++ 没有实现 Linear Typing ,因此无法在编译时(完全)完成唯一性检查。尽管如此,阅读这个描述给了我们一个技巧:为了在编译器中实现它,语言设计者禁止别名并强制执行消费

因此,如果您同意允许一些运行时检查,那么这可以通过让进程使用对象来完成:

class OProcess {
public:
};

std::unique_ptr<OProcessed1> process1(std::unique_ptr<OProcess> op);
std::unique_ptr<OProcess>    process2(std::unique_ptr<OProcess> op);

其中 OProcessed1OProcess 的代理,呈现一个受限接口(interface),仅公开那些在 OProcess 上允许的操作之后 Process1 被调用。

检查的运行时部分是:

void func(std::unique_ptr<OProcess> op) {
    process1(std::move(op));
    process2(std::move(op));
}

将编译,即使在从 op 移动之后执行除销毁/分配之外的任何操作都是未定义的行为。

关于c++ - 编译时检查连续函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19742798/

相关文章:

c++ - 如何在 gtk+ 中创建图形

c++ - 在 OpenCV 中获得投资返回率

javascript - ParserError : Expected pragma, import directive or contract/interface/library definition

C 中函数的冲突类型

c++ - 可变存储与不可变存储

c++ - 我们如何在函数声明中使用函数参数?

c# - 尝试在数据库中查找值时出错

c - 出现错误 : expected declaration specifiers or '...' before string constant

c++ - 与模板实例化相关的编译错误

c++ - 如何在 C++ 14 的类中启动线程?