作者tomex (tomex_ou)
看板C_and_CPP
标题[心得]C++为何只把宣告放在HEADER FILE 内?
时间Sun Apr 30 12:52:49 2006
为何C++要把宣告放在HEADER FILE 内?
我一开始学习此语言也觉得可疑(从高阶往低阶学习),
问老手他们的回答都是:「目的应该是要隐藏实作,
你写在 .h 档里面, 内容不就给人看光了?」
这理由对於用惯c/c++的人,是很正常的解释,
但对於一开始就接触更高阶语言(java/c#)的人就无法怪怪的,
若是不给他人看源码,乾脆包成dll或lib档就行了?!
正确答案就是,c++语言本身在#include特性的限制。
原来c/c++都是靠#include来了解其他的class资讯,
但include很容易重复载入造成error
更加上为了相容c语言中必须先宣告变数才能使用的旧包袱,
因此若要引用别的class之函数型别,
为了加快载入速度,自然切分.h与.cpp比较佳。
c#这种新语言就没这种限制,它通通写在一个class里,
编译器会先把它们compile成中间语言(IL),
再从IL里自动就抽出class的相关型别资讯(metadata)
形成一个dll档,因此源码也不外露,型别辨识也没问题。
相较java或c#的namespace管理,c++使用#include是比较阳春的
其实只要c++ compiler能多聪明一点,编译时能自动辨别该*.h是否已经载入
就不用让程式员必须在每个.h里开头明义就要写这样的赘词:
#ifndefine xxxH
#definde xxxH
当你把一个复杂的class成更多的子class,
使用#include来形容这些就更显不足与繁杂
c++虽然也提出namespace概念,但在巢状namespace实作不是很好
反而让写法更加复杂。
我发现c++为了更快,又要相容c语言,很不习惯去改良容易让人误解的地方
例如新人都知道void是不传回retun的关键字,
但对於指向任何型别的指标用void*就会让人困扰
为何不再创造一个any关键字,any*不是比较直接吗?
然而,c++之所以变化万千,是因为它在不变更目前架构下,
利用很多组合来表达更多意思
虽然很有创意,但对新手而言,容易犯错或不解,
在开发速度上并没有多大助益。
结论,每个语言有它适用的时机及简化的理由,
c++少了高阶语言的智慧功能来增加效能,也减少compiler的冗大复杂
虽然有点不方便的地方,大家就忍耐一点吧!
(写组语的专家可为你的不知福而气闷呢!)
但我心中还是觉得,有些该改该变的,还是要积极变更。
程式码老了就应该要删除码代,不要惜旧,如此才能一直进步才是。
大家为了方便maintaining的理由一直排斥微软的进步,吾不以为然,
既然选了程式员之路,还怕改变吗?
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.119.20.171
1F:推 cplusplus:我希望C#能自动侦测重复用的namespace 每次都不小心重 04/30 13:46
2F:→ cplusplus:复 using ~ 希望也能聪明找出来 QQ java好像最聪明... 04/30 13:49