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

如何在C和C中实现装饰器,第1张

概述我在C和C中有一个情况,可以用像 Python这样的装饰器来解决这个问题:我几乎没有一些我想要的东西包装的功能,所以在函数进入一些语句之前当它留下一些其他功能被执行. 例如,我在库C文件中有几个函数,当被调用时应该锁定信号量,并且在将控件返回到被调用者之前,应该释放信号量.没有锁,他们有以下结构: int f1(int){ ... ... }int f2(char*){ 我在C和C中有一个情况,可以用像 Python这样的装饰器来解决这个问题:我几乎没有一些我想要的东西包装的功能,所以在函数进入一些语句之前当它留下一些其他功能被执行.

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

int f1(int){    ...    ... }int f2(char*){    ....}int f3(blabla){    ....}... fn(...)

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

#lockprotectedint 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()抛出异常的情况下,您仍然不需要担心释放锁.在退出函数之前,所有堆栈对象都将被销毁.

总结

以上是内存溢出为你收集整理的如何在C和C中实现装饰器全部内容,希望文章能够帮你解决如何在C和C中实现装饰器所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1248104.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存