作者alan23273850 (God of Computer Science)
看板C_and_CPP
标题Re: [问题] 请问C介面跟实作分开的作法
时间Sat Apr 28 11:58:32 2018
想问问如果只写了一堆c档,然後其他c档就只 include 我这个C档,
加上ifdef这种防止双重宣告的prototype,不就也可以很顺利的编译程式了吗?
那这样根本就不需要header file阿,为什麽还是需要哩?有解否?
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 42.76.244.229
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1524887914.A.242.html
1F:→ Keiichi: ifdef分别在两个档案通过编译->得到两份实体->link爆炸 04/28 12:08
2F:推 ckc1ark: compile time也有差 04/28 12:27
3F:→ Bencrie: 图灵打球 你当球 04/28 12:49
4F:→ Bencrie: 你要这样玩乾脆就不要 ifdef,全部 static 当 inline 04/28 12:49
5F:→ alan23273850: 写错,是ifndef,这样应该还是只有一份实作吧 04/28 13:44
6F:推 Bencrie: 大家都知道你的 ifdef 是指 include guard ... 04/28 14:04
7F:→ alan23273850: 所以一楼大大应该就讲错了?重点是我曾经用这种方式 04/28 14:28
8F:→ alan23273850: 成功过才发问的喔 04/28 14:28
9F:推 DIE755127: 我觉得差异在include c等於是把一堆实作浓缩在一个tran 04/28 14:57
10F:→ DIE755127: slation unit include h就是透过linker连结其他的tran 04/28 14:57
11F:→ DIE755127: slation unit windows ide会处理比较感觉不出来 linux 04/28 14:57
12F:→ DIE755127: make file写法应该会有差 另外有header对可读跟维护 04/28 14:57
13F:→ DIE755127: 性会比较好 04/28 14:57
14F:→ DIE755127: 其实原文发问是想了解c语言是有什麽特别技巧一定要写 04/28 15:01
15F:→ DIE755127: 成文内提的情况 怕没想好就误会别人 04/28 15:01
16F:推 Bencrie: 一楼没讲错 04/28 16:47
17F:→ Bencrie: 另外同样的 prototype 宣告两次是 ok 的 04/28 16:49
18F:推 Bencrie: 你会 build 成功是因为你实际上只编译一个档案吧 04/28 16:58
19F:→ Schottky: 一楼没讲错。光是compile过跑一两次没问题不代表这种做 04/28 21:37
20F:→ Schottky: 法就永远是对的。你这自信到底是哪来的 04/28 21:37
21F:推 CaptainH: 因为你改了任一档案 就要全部重新编译 04/29 00:28
22F:推 CaptainH: 其他不说 光是重编stdlib就要很久了 04/29 00:31
23F:推 future314: 因为很多时候对实作不感兴趣 与其放很多程式码 不如 04/29 00:38
24F:→ future314: 给我一个简单的介面让我知道怎麽使用就好 04/29 00:39
25F:→ future314: 因此 介面与实作分开减少使用者上手的时间 也增加设计 04/29 00:41
26F:→ future314: 师维护的容易度 这个你写大一点的C程式才有感觉 04/29 00:42
27F:→ future314: 一些OOP可以这样搞是因为他有其他方法去包装 04/29 00:43
28F:→ future314: 可以去听一下jserv大的讲座C的物件导向 04/29 00:46
29F:推 cphe: 没几个档的project这样没差,如果是几万只档这样搞光 04/29 12:09
30F:→ cphe: compile time你就会疯掉 04/29 12:09
31F:嘘 KanzakiHAria: 一楼才是正确的 我前一篇已经说了 04/29 19:43
32F:→ KanzakiHAria: 静态连结在编译时期发现重复定义而无法编过 04/29 19:44
33F:→ KanzakiHAria: 动态连结是执行时载入连结时炸掉 04/29 19:44
34F:→ KanzakiHAria: 你根本就没有做连结的行为当然不会挂 04/29 19:49
35F:→ firose: 如果每个 translation unit 都 include .c 就会造成 obj 04/29 20:13
36F:→ firose: 有重复的内容,整个浪费磁碟空间,至於连结会怎样要测试 04/29 20:14
37F:→ firose: 但很明显的如果某个模组用到某个符号却没 include .c 04/29 20:15
38F:→ firose: 那它就会产生无法决定要用哪个 obj 中的那份定义的问题 04/29 20:15
39F:→ firose: 反正最好的方式当然是一份 .c 转 .obj 别人用 .h 引用它 04/29 20:17
40F:嘘 KanzakiHAria: 众人不要误导 跟compile time一点关系都没有 04/30 14:48
41F:→ KanzakiHAria: 就是最基本的语法错误 连结时会重复定义 04/30 14:48
42F:→ Bencrie: 连结时期会有语法错误???? 04/30 15:10
43F:→ sorryla: linking才出错就不叫语法错误了吧... 04/30 19:50
44F:推 KanzakiHAria: undefined reference to某某某class或function算不 04/30 20:59
45F:→ KanzakiHAria: 算语法错误? 如果不算 那我承认不算语法错误 04/30 20:59
46F:推 AstralBrain: 不算 (完 04/30 21:32
47F:推 Bencrie: 你下 gcc -c 看会不会喷 undefined reference 05/01 02:04
48F:推 jerryh001: 不是叫链结错误吗 05/01 11:32
49F:推 sorryla: 你承不承认无所谓,普遍认知这种情况就是linking error 05/01 20:24
50F:推 KanzakiHAria: 总之无关编译时间长短 也无关占用空间 就是会error 05/01 20:59
51F:推 CoNsTaR: 某 K 笑死,和编译时间无关?连语法错误都出来了 XDDDD 05/03 06:51
52F:推 KanzakiHAria: false imply true 一个一定会error的东西不管说有没 05/03 09:02
53F:→ KanzakiHAria: 有关影响编译时间长短和占用空间都对 05/03 09:03
54F:→ KanzakiHAria: 这两篇从头到尾都是在问什麽情况不行 结果一堆人都 05/03 09:05
55F:→ KanzakiHAria: 在回覆编译时间和占用空间 05/03 09:05
56F:→ KanzakiHAria: 还有人回可以这样做唷^.< 05/03 09:06
57F:→ KanzakiHAria: 谁在搞笑? 05/03 09:06
58F:推 CoNsTaR: 首先,compile errer 代表 source 不能被 compile 成 bin 05/03 23:40
59F:→ CoNsTaR: ary,不代表这份 source 是逻辑上的 false 05/03 23:40
60F:→ CoNsTaR: 第二,不一定会 compile error 05/03 23:40
61F:→ CoNsTaR: 第三,两篇都是问为什麽要这麽做 05/03 23:40
62F:→ CoNsTaR: 最後,你在别人的分享下面讨论其他篇文章,不知道是谁在 05/03 23:40
63F:→ CoNsTaR: 搞笑? 05/03 23:40
64F:嘘 KanzakiHAria: 就说是连结时期一定会炸 没有炸就是因为没连结 05/04 06:57
65F:→ KanzakiHAria: 还在compile.... 05/04 06:57
66F:→ KanzakiHAria: 跟compile time一点关系都没有 不知道要说几次大家 05/04 06:59
67F:→ KanzakiHAria: 才会知道linker的存在 05/04 06:59
68F:→ KanzakiHAria: linker根本边缘人 帮qq 05/04 07:00
69F:推 CoNsTaR: 随便都有一堆不会炸的例子,请说明如何一定会炸?没炸的 05/04 07:01
70F:→ CoNsTaR: 话手动把他炸了吗 XDDDD 05/04 07:01
71F:→ KanzakiHAria: "有甚麽情况下是必须要这样做?" 这行看不到? 05/04 07:01
72F:推 CoNsTaR: 所以是再问为什麽要这麽做啊 有问题吗 05/04 07:03
73F:推 KanzakiHAria: 所以答案就是1F的linking时期error 05/04 07:05
74F:→ CoNsTaR: 又要开始讲和 compile time 没关系了吗 05/04 07:06
75F:→ KanzakiHAria: 单一档案语法正确可以编译 当然没有编译时期error 05/04 07:06
76F:→ KanzakiHAria: 然後因为这样正确就跑来说编译没错 05/04 07:08
77F:→ KanzakiHAria: 废话当然编译没错啊 根本就跟编译无关 05/04 07:08
78F:推 adrianshum: 平心而论K君除了有一点(无伤大雅)的错误用词,他说 05/04 08:16
79F:→ adrianshum: 的是正确的。整件事的症结根本就在linking。 05/04 08:16
80F:推 hakman: K 君大致上来讲是没错啊,但是其他人讲的是为什麽一开始要 05/04 12:57
81F:→ hakman: 这样设计,但是K君一直想把问题简化。大概就是懒人包跟来 05/04 12:58
82F:→ hakman: 龙去脉的差别吧... 05/04 12:59
83F:推 Bencrie: 都是原 po 不好 XD 05/04 14:41