作者adrianshum (Alien)
看板C_and_CPP
标题Re: [问题] .h宣告和定义分开的理由
时间Tue Apr 7 12:04:10 2009
※ 引述《godman362 (Shizuru)》之铭言:
: 小弟写程式也三年了
: 最近开始迈入小型的专案开发
: 但是我看了很多专案的程式码
: 大多都是将.h档的定义和宣告分开来放
: 我看过较多的说法是说不想将实作公开出来
: 但是我觉得这个说法似乎有些微的牵强
: 所以想请问一下各位先进,真正分开做的理由是甚麽?
: 还请各位指点一番。
一点愚见, 有错的话请指正
C/C++ 的世界里, 程式是以个别 source file
(.c/.cpp/.C/.cxx) 来 compile, 每个 source file
会 compile 成对应的 object file, 然後进入
linking 的阶段, 把一堆 object file 连结起
来成为一个完整的 program.
每个 source file compile 的时候都会检查你里面
用的东西存不存在. 比如说你里面用到 foo() function,
compiler compile 你的 src file 就会尝试找究
竟 foo() 是不是存在的东西. 所谓存在, 可以是在
你的 src file 前面已经定义了, 又或者你在前面
宣告. compiler 看到宣告就会知道: "哦, 原来这个
function 会在另一个 source file 定义, 那麽我就当它
存在喽." 是不是真的存在的检查就是 linker 的工作.
而 header file 又是什麽? 其实就只是把那句宣
告放在另一个档案里面, 不然每个要用 foo() 的src
file, 都要自己宣告一次 void foo(); 既麻烦, 又难
maintain. 要记得 #include 的作用, 只不过是把
被include 的档的完整内容安插在 #include 的位置而已.
以我的认知来说, header 简单而言, 就是
开发某物 (X) 的人把 X 的宣告抽取出来, 让其他人
可以简单的在使用 X 的 source 中轻易作出 X 的宣告.
而所谓把实作隐藏, 我觉得不是本意. 比如在 class
declaration, 连所有 private member 都要写, 何来
隐藏? (所以才有真的为了隐藏实作而用 Bridge pattern)
Alien
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 202.155.236.82
1F:推 Bencrie:推这篇 XD 04/07 12:34
2F:推 VictorTom:推这位大大的说明<(_ _)> 04/07 12:34
3F:推 weiyucsie:推荐这篇文章XD 04/08 20:29