什么而什么用
有一个问题是“什么时候用C++而不用C”,我一直觉得问错了,难道不是“能用C++就不用C”么?那么当然就要讨论什么时候用C而不用C++啦。
一直以来都严格遵循OO的原则来进行开发(用的工具是C#和Qt),直到最近,开始接手某同事的代码,整个项目20多个小工程(代码量并不多),除了界面部分用了MFC这种不伦不类的OO以外,所有的代码都是C写的。但是模块化做的非常好。后来跟他讨论为何不用C++,他说其实没有什么特别的,就是习惯和爱好而已,后又补充:
如果不用多态的话,其实不管怎么写,不管用那种语言写,都算不上真正的OO
忽然觉得很有道理……
Felis sapiens
当你期望把你做的库移植到很多其他语言的时候,C更具优势。你也可以底层用C++实现,不过做一层C包装也是有必要的。
要问为什么,一门语言实现C FFI的难度和C++ FFI的难度显然不在一个数量级。。
小编分类整理了许多C语言进阶学习材料和BAT面试题,需要资料的请进Q群:731611386免费领取
Xi Yang
1:不能容忍C++的ABI相关问题的时候
徐辰
没C++可用的时候。
对于还停留在C with class那个年代的人来说,C++也就只能玩玩OOP。如果再学一下设计模式那这一生就彻底毁了,只有java能拯救。
luikore
setjmp/longjmp 的时候. 很简单的一个 RaiI 泄漏例子:
vector a;
a.push_back(3);
longjmp(env, 0);
// 编译器插入隐藏的析构调用被跳过了
一些语言例如 Ruby 的 raise/yield/throw 就是用长跳实现的, 用 C++ 写扩展的话, 一不小心就造成内存泄漏了:
vector a;
a.push_back(3);
rb_funcall(obj, rb_intern(“foo”), 0); // 你并不知道 foo 里会不会抛异常长跳
C++ 的 throw 因为也会插入隐藏的析构代码造成坑, 所以这类情况还是推荐只用 C
韦易笑
你开始欣赏到纯 C代码所带来的 “美感” 了,即简单性和可拆分性。代码是自底向上构造,一个模块只做好一个模块的事情,任意拆分组合。对于有参考的 OOP系统建模,自顶向下的构造代码抽象方法是有效率的,是方便的,对于新领域,没有任何参考时,刻意抽象会带来额外负担,并进一步增加系统耦合性,设计调整,往往需要大面积修改代码。
有兴趣你可以读读《Unix编程艺术》,OOP的思维模式,是大一统的;C的思维模式,是分离的。前者方便但容易造成高耦合,后者灵活但开发开发太累。用 C开发,应该刻意强调 “简单” 和 “可拆分”。一个个象搭积木一样的把基础系统搭建出来,哪个模块出问题,局部替换即可。
自底向上的开发模式,并不是从不站在大局考虑问题,而是从某个子系统具体实现开始,从局部迭代,逐步反思全局设计,刻意保持低偶合,一个模块一个模块的来,再逐步尝试组合。
自底向上强调先有实践,再总结理论,理论反过来指导实践,又从实践中迭代修正理论。这和人类认识世界的顺序是一样的,先捕猎筑巢,反思自然是怎么回事,又发现可以生火,又思考自然到底怎么回事情。
它的反面,是指大一统设计,你一开始用 UML画出整套系统的类结构,然后再开工设计。这种思维习惯,如果是参考已有系统做一个类似的设计,问题不大,全新设计的话,他总有一个前提,就是 “你能完整认识整个大自然”,就像人类一开始就要认识捕猎和筑巢还有取火一样。否则每次对世界有了新认识,OOP的自顶向下设计方法都能给你带来巨大的负担。
所以有些人才会说:OOP设计习惯会依赖一系列设计灵巧的 BaseObject,然而过段时间后再来看你的项目,当其中某个基础抽象类出现问题是,往往面临大范围的代码调整。这其实就是他们使用自顶向下思维方法,在逐步进入新世界时候,所带来的困惑。
当然也有人批判这种强调简单性和可拆分性的 Unix思维。认为世界不是总能保持简单和可拆分的,他们之间是有各种千丝万缕联系的,你一味的保持简单性和可拆分性,你会让别人很累。这里给你个药方,底层系统,基础组建,尽量用 C的方法,很好的设计成模块,随着你编程的积累,这些模块象积木一样越来越多,而彼此都无太大关系,甚至不少 .c文件都能独立运行,并没有一个一统天下的 common.h让大家去 include,接口其他语言也方便。
然后在你做到具体应用时根据不同的需求,用C++或者其他语言,将他们象胶水一样粘合起来。这时候,再把你的 common.h,写到你的 C++或者其他语言里面去。当然,作为胶水的语言不一定非要是 C++了,也可以是其他语言。
PS: 这里主要在探讨 OOP存在的问题,并没有讨论嵌入式这种资源限制的情况,以及操作系统和底层等需要精确控制硬件和内存的情况,更没有讨论 C++在语言设计层面的事情。
小编分类整理了许多C语言进阶学习材料和BAT面试题,需要资料的请进Q群:731611386免费领取
相关阅读
如今SEO优化行业发展至今,出现很多网站SEO优化专做的培训机构,上海网站优化价钱不同,置于主要的价钱,需看培训机构是如何要求的。
数据库 “数据库”是以一定方式储存在一起、能够多个用户共享、具有尽可能小的冗余度、与应用程序彼此独立的数据集合。 【基本
在COSMIC方法中,功能处理可拆分为四种数据移动:输入,输出,读,写。数据移动是最小的、不可再拆分的、软件内部的动作。在数据移动中包含
韩都衣舍是一家可以学习,但是很难模仿的企业。曾经有机会向其老板赵迎光请教,他的管理能力不能一般的强,在创新方面也是大量的模仿再
一、决策树决策树– 提供了一种展示类似在什么条件下会得到什么值这类规则的方法– 每个分支要么是一个新的决策节点,要么是树的叶