加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

如何在C和C中实现装饰器

发布时间:2020-12-16 05:33:44 所属栏目:百科 来源:网络整理
导读:我在C和C中有一个情况,可以用像 Python这样的装饰器来解决这个问题:我几乎没有一些我想要的东西包装的功能,所以在函数进入一些语句之前当它留下一些其他功能被执行. 例如,我在库C文件中有几个函数,当被调用时应该锁定信号量,并且在将控件返回到被调用者之前
我在C和C中有一个情况,可以用像 Python这样的装饰器来解决这个问题:我几乎没有一些我想要的东西包装的功能,所以在函数进入一些语句之前当它留下一些其他功能被执行.

例如,我在库C文件中有几个函数,当被调用时应该锁定信号量,并且在将控件返回到被调用者之前,应该释放信号量.没有锁,他们有以下结构:

int f1(int)
{
    ...
    ... 
}

int f2(char*)
{
    ....
}

int f3(blabla)
{
    ....
}

... fn(...)

我想定义一个全局信号量,应该在函数返回之前调用和释放这些函数之前锁定.我想尽可能简单的做到这一点;接近这样的事情

#lockprotected
int f1(int)
{
   ... /* nothing changed over here */
}
#endlockprotected

或类似的东西

int f1(int)
{
   ... /* nothing changed over here */
}
#lockprotected f1

我不想要的是:

>更改函数名称,因为它们是库函数,并且正在从许多地方调用.
>在返回调用之前明确地放置任何语句,因为大多数函数之间有很多早期的返回值.或者为了改变任何内部功能.

最优雅的方式是什么?

解决方法

使用RAII(资源获取是初始化)来定义互斥体上的锁定.这将允许您忘记点#2,即您不需要跟踪return语句来释放锁.
class Lock {
public:
    Lock () { // acquire the semaphore }
    ~Lock () { // release the semaphore }
}

接下来在函数开始创建这个类的对象,即,

int f1 (int) {
    Lock l;
    // forget about release of this lock
    // as ~Lock() will take care of it
}

这方面的一个优点是,即使在从f1()抛出异常的情况下,您仍然不需要担心释放锁.在退出函数之前,所有堆栈对象都将被销毁.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读