作者littleshan (我要加入剑道社!)
看板C_and_CPP
标题Re: [心得]C++为何只把宣告放在HEADER FILE 内?
时间Sun Apr 30 14:31:51 2006
※ 引述《tomex (tomex_ou)》之铭言:
: 为何C++要把宣告放在HEADER FILE 内?
: 我一开始学习此语言也觉得可疑(从高阶往低阶学习),
: 问老手他们的回答都是:「目的应该是要隐藏实作,
: 你写在 .h 档里面, 内容不就给人看光了?」
你问的真的是老手吗?
: 这理由对於用惯c/c++的人,是很正常的解释,
: 但对於一开始就接触更高阶语言(java/c#)的人就无法怪怪的,
: 若是不给他人看源码,乾脆包成dll或lib档就行了?!
: 正确答案就是,c++语言本身在#include特性的限制。
: 原来c/c++都是靠#include来了解其他的class资讯,
: 但include很容易重复载入造成error
: 更加上为了相容c语言中必须先宣告变数才能使用的旧包袱,
: 因此若要引用别的class之函数型别,
: 为了加快载入速度,自然切分.h与.cpp比较佳。
原因可能很多
加快速度应该是最不重要的
打从人类还在写组合语言的时代
界面和实作就是分离的
界面和实作分离有许多好处
同样的 function prototype 可以有不同的 implementation
client code 不须要改变任何一行程式码
只要连结不同的 library 就可以使用不同的 implementation
甚至如果你是用 dynamic linking 的方式
就算 library 有改版 只要界面还是相同的
那 client code 连重编都不用
: c#这种新语言就没这种限制,它通通写在一个class里,
: 编译器会先把它们compile成中间语言(IL),
: 再从IL里自动就抽出class的相关型别资讯(metadata)
: 形成一个dll档,因此源码也不外露,型别辨识也没问题。
: 相较java或c#的namespace管理,c++使用#include是比较阳春的
是啊 你会问说
为什麽 C++ 的 #include 没有这麽聪明?
因为 #include 是 preprocessor 在做的
preprocessor 不是 compiler
它只认得注解和井号开头的关键字
所以它不知道你写 class XXX 是在宣告类别
自然也无法从实作中抽取界面
这的确是 (我认为) 目前 C++ 的不足之处
: 其实只要c++ compiler能多聪明一点,编译时能自动辨别该*.h是否已经载入
: 就不用让程式员必须在每个.h里开头明义就要写这样的赘词:
: #ifndefine xxxH
: #definde xxxH
这就和前面的界面实作分离一点关系也没有了
这只是在避免重覆宣告
: 当你把一个复杂的class成更多的子class,
这是什麽意思?
: 使用#include来形容这些就更显不足与繁杂
: c++虽然也提出namespace概念,但在巢状namespace实作不是很好
: 反而让写法更加复杂。
: 我发现c++为了更快,又要相容c语言,很不习惯去改良容易让人误解的地方
很简单啊
如果 C++ 改了它
那 C++ 根本就无法流行
C++ 设计之初的要求就是尽可能和 C 相容
因此程式设计师几乎不用死任何脑细胞就可以继续使用现有的 C library
: 例如新人都知道void是不传回retun的关键字,
: 但对於指向任何型别的指标用void*就会让人困扰
: 为何不再创造一个any关键字,any*不是比较直接吗?
你用的是 C++ 吗?
为什麽你会用到 void* ?
如果程式写得好 这东西根本就不需要
: 然而,c++之所以变化万千,是因为它在不变更目前架构下,
: 利用很多组合来表达更多意思
: 虽然很有创意,但对新手而言,容易犯错或不解,
: 在开发速度上并没有多大助益。
: 结论,每个语言有它适用的时机及简化的理由,
: c++少了高阶语言的智慧功能来增加效能,也减少compiler的冗大复杂
: 虽然有点不方便的地方,大家就忍耐一点吧!
: (写组语的专家可为你的不知福而气闷呢!)
: 但我心中还是觉得,有些该改该变的,还是要积极变更。
: 程式码老了就应该要删除码代,不要惜旧,如此才能一直进步才是。
: 大家为了方便maintaining的理由一直排斥微软的进步,吾不以为然,
^^^^^^^^^^
首先 这世界并不是只有微软在发明新语言
其次 你可能不太了解微软为了相容性而在 windows 内作了多少调整
: 既然选了程式员之路,还怕改变吗?
不是怕改变
而是重写一套大型软体的难度不下於盖一栋101
当然 很有钱的情况另当别论
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 61.62.3.35
※ 编辑: littleshan 来自: 61.62.3.35 (04/30 14:32)
1F:推 tomex:你的意见也很不错的,给我很好的指正,谢谢。 04/30 14:49
2F:推 GoldenField:为什麽void* 不需要 @@a? 04/30 15:59
3F:推 littleshan:倒不如问 为什麽需要void* 04/30 19:22
4F:推 zeus1208:那请问...有人可以说明"mpi.h"怎麽汇入吗~ (跪) 04/30 19:50
5F:推 GoldenField:如果不知道档案型态的时候 用void*不是很正常吗? 04/30 19:52
6F:→ GoldenField:应该是 变数型态 04/30 19:52
7F:推 orc1424:微软为了相容性真的太痛苦了... 05/01 21:14