gpt4 book ai didi

c++ - 在 C++ 中多次调用给定函数时,有没有办法引发编译时错误?

转载 作者:行者123 更新时间:2023-12-05 09:36:02 27 4
gpt4 key购买 nike

在 C++ 中有没有一种方法可以设计一个函数/向它添加一些“属性”,从而在代码中多次调用它会引发编译时错误?

给出一点背景/动机:我在 Mbed-OS 上编程,我犯了几个错误,如下所示:

rtos::Thread thread;

[lots of code]

thread.start(persistent_function_1);

[lots of code in a setup function]

thread.start(persistent_function_2);

这产生了(逻辑上的)后果,即本应允许在程序的生命周期内执行的 persistent_function_1 只能执行到线程被重新用于运行 persistent_function_2。我花了很长时间才找到这个错误,我想知道我是否可以对我的 thread.start 函数做些什么,以确保如果我再次犯这种错误,我会得到一个编译器错误。

最佳答案

我认为没有办法直接强制 C++ 语言在编译时检测 start() 的双重调用(换句话说,我认为 @user4581301 的建议行不通): 要静态声明一个属性,您需要以某种方式更改实体。我确定您可以使用 clang 编写自定义检查器但我想那不是你想要的。显然,可以有一个运行时断言,它报告一个已经被 start()ed 的线程再次启动。同样,这似乎不是您所追求的。

“显而易见”的解决方案是不要在函数中包含“[大量代码]”。事实上,std::thread 通过强制在对象声明和它的开始之间没有 代码完全回避了这个问题:std::thread 在构建时开始。在对象声明和开始之间使用“[lots of code]”的设置类似于

my::thread thread([&]{
[lots of code]
return persistent_function_1;
}());

需要注意的是,您需要无序地设置各种变量。也就是说,首选方法是在实际启动的位置声明 thread 对象:

[lots of code]
my::thread thread(persistent_function_1);

在这两种情况下,my::thread 将是 rtos::thread 的简单包装器,它不会公开单独的 start() 方法。因为我不知道为什么 rtos::thread 将构造和 start() 分开,一个合理的原因可能是设置各种线程参数的能力,这可能是合理的为 my::thread 的构造函数实际使用两个单独的参数:

  1. 一个以 my::thread::properties 实体作为参数的函数,它允许对 thread 对象进行必要的操作。
  2. 要启动的函数。

也就是类似

my::thread thread([](my::thread::properties& properties) {
[lots of code manipulating the properties]
},
persistent_function_1);

这样,仍然可以操作线程,但您不可能start()一个线程两次。

关于c++ - 在 C++ 中多次调用给定函数时,有没有办法引发编译时错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65400350/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com