免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: starwing83
打印 上一主题 下一主题

[C++] 收到《Imperfect C++》了,说说我的感想……(更新在第40楼) [复制链接]

论坛徽章:
0
21 [报告]
发表于 2012-10-21 23:58 |只看该作者
如果按照閣下邏輯,是不是就不應該存在那麼多CPP成功大型項目了?
難道閣下認為有perfect的工具嗎?
給了閣下選擇,反倒成了閣下的負擔,可悲可嘆。

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
22 [报告]
发表于 2012-10-22 00:55 |只看该作者
回复 21# 哲學家


    不,看来你误会我的意思了。

我用C++也很久了。C++的特性如果给予人选择,我觉得很好,这绝不是负担,我说的也绝没有包含这些方面。

我说的是,假设我设计一个class,我对这个class有一些要求——很合理的要求:比如说,可以传递给C的程序——这个要求应该来说是比较合理的。或者如果觉得不合理——我希望可以做成dll并且跨编译器通用,这个至少比较合理吧?

好,这样的一个要求C++却无法完成,有办法80%的完成,有办法90%的完成,但是却没有办法100%的完成。

再举一个例子,单例模式,大家都知道吧。那么怎么实现一个无bug的单例模式呢?有没有所谓的“样板代码”呢?同样,有办法90%的完成,甚至99.99%的完成,但是同样无法100%的完成。

这些代码有一些共同的特征:因为C++的某些宽泛的设定,这些代码可能会在极其罕见的情况下失效,而且是神秘失效,你根本不知道是这里引起的。

不要觉得危言耸听。链接顺序影响单例对象的初始化顺序,这就是一个例子。

所以这就是我觉得C++不完美的地方,也是我在正式项目里尽量避免C++的地方,因为我希望对我的项目进行100%控制,我不希望我在代码里面到处留下这种注释“XXX:This works, but careful XXXX”,一直留到我自己都不知道有多少的地步,想想就觉得太可怕了!

相反,C++提供特性,甚至是驳杂的特性,我都觉得没什么。我担心的不是C++特性多杂不好选择,我担心的是C++的特性并不难做到他们宣称的那些事情。

(比如说static对象宣称自己在第一次使用的时候初始化,在最后一个使用后析构,很不错,可惜很多static对象事实上做不到这一点)

论坛徽章:
0
23 [报告]
发表于 2012-10-22 07:22 |只看该作者
如果matthew willson看到这个帖子,他将会哭笑不得…

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
24 [报告]
发表于 2012-10-22 08:25 |只看该作者
回复 22# starwing83

>> 好,这样的一个要求C++却无法完成,有办法80%的完成,有办法90%的完成,但是却没有办法100%的完成。

让你用class。


>> 再举一个例子,单例模式,大家都知道吧。那么怎么实现一个无bug的单例模式呢?有没有所谓的“样板代码”呢?同样,有办法90%的完成,甚至99.99%的完成,但是同样无法100%的完成。

让你用单例。


>> 不要觉得危言耸听。链接顺序影响单例对象的初始化顺序,这就是一个例子。

让你用zero init之外的东西。


BTW: 用C,你又能怎么做到100%控制? 上面说的东西都是C没有的。
唯一答案就是: 全都自己手写。 这还是在没有bug的情况下, 才敢说100%控制。 漏掉一个原本应该由机器检查出来的错误就亏大了。

你希望在代码留下模拟C++部分特性的代码, 一直留到偶尔暗自神伤: 哎,这地方又是C++的那啥啥。唉,手工处理错误太繁琐了。
想想就觉得太滑稽了。。。



>> (比如说static对象宣称自己在第一次使用的时候初始化,在最后一个使用后析构,很不错,可惜很多static对象事实上做不到这一点)

如果static做不到这点,那你又怎么做到这点?

不说语言特性,说需求。 你有没有需要on load初始化? 需要on demand初始化的情况?
你可以说很少,但你能说绝对没有?
哦,当然非要避免也是可以做到的: 把这事丢给库的用户去处理就ok了。 那你的用户又该怎么处理? 你的git clone REPO && cd REPO && make的便利呢。。。


你的代码里就没有不是因为C++但依然留下了“XXX:This works, but careful XXXX”的地方?唉,又好久没看过你代码了。。。

也就是说,你的观点换种说法就是:C++不全都是我想象中的那个样子,我也懒得去研究它的全体样子;于是我选择彻底远离它,哪怕它的提供的某些很清晰的特性恰好符合的需求也是如此。
以及,不用C++软件开发本身的复杂性就可以被避免了似的。 因为不用C++, 初始化问题就没了? 这可能吗? 你怎么不把这部分给说出来?
你哪怕就说一句:C缺乏的那部分我就是喜欢自己手工搞 —— 这就是100%控制的意思, 能把它说清楚明白点么?
那我就不当你是在黑C++了。 你不把这说出来, 会带坏多少没有辨别能力的小朋友你知道吗?


你已经被lua带坏了。 之前是凡事将性能放在很重的位置。 这里是只要不能100%控制就丢。
RST是py的,丢。 Darcs是Haskell的,丢。MD有lua的实现,保留。 Git是C的,保留。 vim是C的, 暂时保留。
我记得你让我用sub啥啥的编辑器, 去看看它的界面。 然后你说了一句, 类似"有它这个项目做例子,用开罗(我不知道怎么拼,你懂的)就放心了"。
喜欢100%掌控的你, 怎么要让其他人的项目帮你去踩雷呢? 应该自己去啊?
哦,因为开罗是C的,哪怕现在没有100%掌控,也有100%掌控的潜力? 真的有这个潜力? 真的有这潜力发挥的一天?

有是肯定的,但我怎么觉得这潜力生效的几率比起C++中那清晰的部分的比率 —— 但因为纯C而放弃 —— 要少得多呢?

论坛徽章:
0
25 [报告]
发表于 2012-10-22 08:54 |只看该作者
看了上面的学习曲线,我想说的是,不是因为学了 c 才水平提高,而是因为经历了风雨,才对计算机有了深刻的认识,这种认识和语言无关。有了这种认识,可以自由的选择适合的语言工具。

论坛徽章:
0
26 [报告]
发表于 2012-10-22 09:08 |只看该作者
linux_c_py_php 发表于 2012-10-21 14:01
大爱纯C和纯C++(仅仅用最基础的封装与单继承多态).


+1

论坛徽章:
0
27 [报告]
发表于 2012-10-22 10:10 |只看该作者
starwing83 发表于 2012-10-21 13:57
感想是,(估计@边学CPP边骂CPP会开心了)这本书坚定了我不在严肃正式的项目里面使用C++的决心…………

...


ABI 是需要运行环境,操作系统结合的,

编程语言只是单独的编程语言,
一个单纯的语言怎么能有ABI,
整个Linux都没有一个ABI,C++能有ABI?

因为C/C++ 是操作系统的胶水语言,所以注定了没有ABI规范.
因为你不可能统一Linux /Win的ABI


JAVA有ABI,因为他有一个的JVM,
c++/cx有ABI,因为他有WINRT
OJB-C 有ABI,因为他有metadata
他们都有metadata

C/C++ 没有metadata,可能未来也没有.




论坛徽章:
0
28 [报告]
发表于 2012-10-22 11:04 |只看该作者
aaxron 发表于 2012-10-22 10:10
ABI 是需要运行环境,操作系统结合的,

编程语言只是单独的编程语言,

其实metadata在某些场合是非常必要的,要是C++能提供一种“可选”的metadata构建方法就好了。现在自己实现一套metadata太麻烦了。

论坛徽章:
0
29 [报告]
发表于 2012-10-22 11:35 |只看该作者
只觉得楼主矫情。

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
30 [报告]
发表于 2012-10-22 12:03 |只看该作者
回复 1# starwing83


    c++是很优秀的语言。但它不会让使用它的人更加优秀。如果你能设计出一个使程序员在使用中变得更优秀的语言,我强烈支持你。

C++有这个好处:它给应用提供了几乎所有有用的特征(当然,某些程序上,可以说是缺点),并给了它们十分严格,统一的定义。这个东西,很多号称比C++更优秀的语言都做不到。

至于ABI,用C++的时候,用什么ABI,装B么?如果编译器相同,可以防COM,用Vitual Table做接口(可能有人要喷,因为据说反对用VT做接口的)。
你能举出像C++这种复杂的语言,有某个有ABI的例子么?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP