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

前端之家收集整理的这篇文章主要介绍了如何在C和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()抛出异常的情况下,您仍然不需要担心释放锁.在退出函数之前,所有堆栈对象都将被销毁.

原文链接:https://www.f2er.com/c/114384.html

猜你在找的C&C++相关文章