理解有经验的C程序员的C语法

理解有经验的C程序员的C语法,第1张

概述我正在查看MongoDB的源代码,并在函数内部看到以下声明,我不理解并且在我的C编程经验中没有看到. Lock::DBLock dbLock(txn->lockState(), ns.db(), MODE_X); 我试图理解这个声明在C术语中做了什么(即我想要理解语法,而不是关于正在发生的功能的具体细节). 这分为两个主要问题: 1)函数前面的Lock :: DBLock语句的用途是什么? 2)这 我正在查看MongoDB的源代码,并在函数内部看到以下声明,我不理解并且在我的C编程经验中没有看到.

Lock::DBLock dbLock(txn->lockState(),ns.db(),MODE_X);

我试图理解这个声明在C术语中做了什么(即我想要理解语法,而不是关于正在发生的功能的具体细节).

这分为两个主要问题:
1)函数前面的Lock :: DBLock语句的用途是什么?
2)这是函数调用还是函数声明?

解决方法 它是一个带有构造函数的变量声明 – 所以它是[对象构造函数]的函数调用和变量的声明.

它声明了一个类型的变量;

Lock::DBLock

该变量称为dbLock.它使用txn-> lockState(),ns.db()和MODE_X调用构造函数.

我的猜测是txn-> lockState实际上返回一个锁对象,我们锁定的东西是ns.db() – 在“独占模式”.但这是猜测,你必须在环境中查看这些内容.

在没有查找文档的情况下,我希望Lock :: DBLock是一个“锁定管理器”,换句话说,它在创建时获取锁定,并在销毁时释放.

一个简单的锁管理器看起来像这样:

class LockMgr {      LockMgr(SomeLockType &X) : keeper(X)      {         keeper.Lock();      }      ~LockMgr()      {         keeper.Unlock();      }      private:        SomeLockType& keeper;    // Must be reference to original lock };

当变量超出范围时,会自动调用析构函数(更糟糕的是,当您离开变量所在的{}对时.

在C中,“资源处理”的一个通用策略称为RAII(资源获取是初始化) – 变量用于保存资源,并在初始化期间分配.这有很多帮助“不要忘记撤消” – 例如在函数中间返回的代码中,确实中断退出循环或类似的东西.在C中,你总是要注意释放锁,关闭文件,释放内存等等 – 当然,如果你以错误的方式使用C,你可能会陷入同样的​​陷阱 – 调用new肯定需要一个调用delete,直接调用lock Lock()成员函数需要在某处调用Unlock().但是如果我们将资源“包装”到一个持有它的对象中我们需要它,并在析构函数中自动“释放”(释放,解锁等),就不需要记住释放内存,解锁,等等

我建议在提出进一步的问题之前,先阅读关于类和构造函数的第一章. your C++ book中的析构函数对(你有一本书,对吧?)

总结

以上是内存溢出为你收集整理的理解有经验的C程序员的C语法全部内容,希望文章能够帮你解决理解有经验的C程序员的C语法所遇到的程序开发问题。

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

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存