C_and_CPP 板


LINE

※ 引述《godman362 (Shizuru)》之铭言: : 小弟写程式也三年了 : 最近开始迈入小型的专案开发 : 但是我看了很多专案的程式码 : 大多都是将.h档的定义和宣告分开来放 : 我看过较多的说法是说不想将实作公开出来 : 但是我觉得这个说法似乎有些微的牵强 : 所以想请问一下各位先进,真正分开做的理由是甚麽? : 还请各位指点一番。 有时候是因为实做的各个c/cpp档案里面可以存在static function(private function) 在有些时候,你不希望使用者直接修改你的变数内容或者结构体资讯时,你会把 结构体包成Handle (void*),这可以达成encapulation的效果。 将定义跟宣告分开,除了意外的你得到了一个附加的api,也可以免除维护上的困难, (不管你有没有得到一个附加的api,函式说明还是以document输出的好。) 但最主要克服的还是在linker上的工作,如果你的实作不是inline且不是template 更不是class的implicit inline,那麽你就会在linker阶段碰上问题, 今天你在cpp 1里面因为header得到了global var A,cpp 1被编译为obj1 cpp2经由header得到了A的实体, 所以也来了个global var A,而你的专案需求是这两个obj要结合成一个档案 这时候就出现了重复定义的情况。 发布成dll的时候,差别就是你一定要把实作跟宣告分开,且要发布的进入点如果不是 inline/template,那就要用__declspec(dllexport) 修饰,在释出档要把header的 dllexport改为dllimport。 比如你在建立一个dll专案时会出现 #if BUILDING_DLL # define DLLAPI __declspec(dllexport) #else # define DLLAPI __declspec(dllimport) #endif 发布的格式如 DLLAPI RET_T FunctionName(); struct DLLAPI StructName{ ... }; class DLLAPI ClassName{ ... }; typedef,enum 的型别就不用了,这是compile阶段的。 全域变数 extern DLLAPI TYPE VARNAME; 假使全域变数是一个function pointer时也要汇出 --



※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 61.227.112.207
1F:→ Bencrie:其实header本来就是为了分档用。把一个大程式拆成很多个 04/07 12:35
2F:→ Bencrie:source编译成很多个object,最後才全部连结起来。 04/07 12:36
3F:→ Bencrie:如果不分档,那麽每次改一点东西就要花很多时间重编译。 04/07 12:37
4F:→ Bencrie:而分档过的程式则可以针对被改过的source file重新编译 04/07 12:38
5F:→ Bencrie:成object然後再跟之前没动到的object做连结,省下不必要 04/07 12:39
6F:→ Bencrie:的编译时间。 04/07 12:39
7F:→ sunneo:原来如此 感谢楼上的说明 <(_ _)>04/07 12:38
※ 编辑: sunneo 来自: 61.227.112.207 (04/07 12:45)







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:WOW站内搜寻

TOP