Re: [问题] 请问C接口跟实作分开的作法

楼主: alan23273850   2018-04-28 11:58:32
想问问如果只写了一堆c档,然后其他c档就只 include 我这个C档,
加上ifdef这种防止双重宣告的prototype,不就也可以很顺利的编译程式了吗?
那这样根本就不需要header file阿,为什么还是需要哩?有解否?
作者: Keiichi (Keiichi)   2018-04-28 12:08:00
ifdef分别在两个档案通过编译->得到两份实体->link爆炸
作者: ckc1ark (伪物)   2018-04-28 12:27:00
compile time也有差
作者: Bencrie   2018-04-28 12:49:00
图灵打球 你当球你要这样玩干脆就不要 ifdef,全部 static 当 inline
楼主: alan23273850   2018-04-28 13:44:00
写错,是ifndef,这样应该还是只有一份实作吧
作者: Bencrie   2018-04-28 14:04:00
大家都知道你的 ifdef 是指 include guard ...
楼主: alan23273850   2018-04-28 14:28:00
所以一楼大大应该就讲错了?重点是我曾经用这种方式成功过才发问的喔
作者: DIE755127   2018-04-28 14:57:00
我觉得差异在include c等于是把一堆实作浓缩在一个translation unit include h就是透过linker连结其他的translation unit windows ide会处理比较感觉不出来 linuxmake file写法应该会有差 另外有header对可读跟维护性会比较好其实原文发问是想了解c语言是有什么特别技巧一定要写成文内提的情况 怕没想好就误会别人
作者: Bencrie   2018-04-28 16:47:00
一楼没讲错另外同样的 prototype 宣告两次是 ok 的你会 build 成功是因为你实际上只编译一个档案吧
作者: Schottky (顺风相送)   2018-04-28 21:37:00
一楼没讲错。光是compile过跑一两次没问题不代表这种做法就永远是对的。你这自信到底是哪来的
作者: CaptainH (Cannon)   2018-04-29 00:28:00
因为你改了任一档案 就要全部重新编译其他不说 光是重编stdlib就要很久了
作者: future314 (未来π)   2018-04-29 00:38:00
因为很多时候对实作不感兴趣 与其放很多程式码 不如给我一个简单的接口让我知道怎么使用就好因此 接口与实作分开减少使用者上手的时间 也增加设计师维护的容易度 这个你写大一点的C程式才有感觉一些OOP可以这样搞是因为他有其他方法去包装可以去听一下jserv大的讲座C的物件导向
作者: cphe (魔鬼藏在垃圾筒里)   2018-04-29 12:09:00
没几个档的project这样没差,如果是几万只档这样搞光compile time你就会疯掉
作者: KanzakiHAria (神崎・H・アリア)   2018-04-29 19:43:00
一楼才是正确的 我前一篇已经说了静态连结在编译时期发现重复定义而无法编过动态连结是执行时加载连结时炸掉你根本就没有做连结的行为当然不会挂
作者: firose (guest也是也是也是也是也)   2018-04-29 20:13:00
如果每个 translation unit 都 include .c 就会造成 obj有重复的内容,整个浪费磁盘空间,至于连结会怎样要测试但很明显的如果某个模组用到某个符号却没 include .c那它就会产生无法决定要用哪个 obj 中的那份定义的问题反正最好的方式当然是一份 .c 转 .obj 别人用 .h 引用它
作者: KanzakiHAria (神崎・H・アリア)   2018-04-30 14:48:00
众人不要误导 跟compile time一点关系都没有就是最基本的语法错误 连结时会重复定义
作者: Bencrie   2018-04-30 15:10:00
连结时期会有语法错误????
作者: sorryla (Mr.东)   2018-04-30 19:50:00
linking才出错就不叫语法错误了吧...
作者: KanzakiHAria (神崎・H・アリア)   2018-04-30 20:59:00
undefined reference to某某某class或function算不算语法错误? 如果不算 那我承认不算语法错误
作者: AstralBrain   2018-04-30 21:32:00
不算 (完
作者: Bencrie   2018-05-01 02:04:00
你下 gcc -c 看会不会喷 undefined reference
作者: jerryh001   2018-05-01 11:32:00
不是叫链结错误吗
作者: sorryla (Mr.东)   2018-05-01 20:24:00
你承不承认无所谓,普遍认知这种情况就是linking error
作者: KanzakiHAria (神崎・H・アリア)   2018-05-01 20:59:00
总之无关编译时间长短 也无关占用空间 就是会error
作者: CoNsTaR ((const *))   2018-05-03 06:51:00
某 K 笑死,和编译时间无关?连语法错误都出来了 XDDDD
作者: KanzakiHAria (神崎・H・アリア)   2018-05-03 09:02:00
false imply true 一个一定会error的东西不管说有没有关影响编译时间长短和占用空间都对这两篇从头到尾都是在问什么情况不行 结果一堆人都在回复编译时间和占用空间还有人回可以这样做唷^.<谁在搞笑?
作者: CoNsTaR ((const *))   2018-05-03 23:40:00
首先,compile errer 代表 source 不能被 compile 成 binary,不代表这份 source 是逻辑上的 false第二,不一定会 compile error第三,两篇都是问为什么要这么做最后,你在别人的分享下面讨论其他篇文章,不知道是谁在搞笑?
作者: KanzakiHAria (神崎・H・アリア)   2018-05-04 06:57:00
就说是连结时期一定会炸 没有炸就是因为没连结还在compile....跟compile time一点关系都没有 不知道要说几次大家才会知道linker的存在linker根本边缘人 帮qq
作者: CoNsTaR ((const *))   2018-05-04 07:01:00
随便都有一堆不会炸的例子,请说明如何一定会炸?没炸的话手动把他炸了吗 XDDDD
作者: KanzakiHAria (神崎・H・アリア)   2018-05-04 07:01:00
"有什么情况下是必须要这样做?" 这行看不到?
作者: CoNsTaR ((const *))   2018-05-04 07:03:00
所以是再问为什么要这么做啊 有问题吗
作者: KanzakiHAria (神崎・H・アリア)   2018-05-04 07:05:00
所以答案就是1F的linking时期error
作者: CoNsTaR ((const *))   2018-05-04 07:06:00
又要开始讲和 compile time 没关系了吗
作者: KanzakiHAria (神崎・H・アリア)   2018-05-04 07:06:00
单一档案语法正确可以编译 当然没有编译时期error然后因为这样正确就跑来说编译没错废话当然编译没错啊 根本就跟编译无关
作者: adrianshum (Alien)   2018-05-04 08:16:00
平心而论K君除了有一点(无伤大雅)的错误用词,他说的是正确的。整件事的症结根本就在linking。
作者: hakman (^____^)   2018-05-04 12:57:00
K 君大致上来讲是没错啊,但是其他人讲的是为什么一开始要这样设计,但是K君一直想把问题简化。大概就是懒人包跟来龙去脉的差别吧...
作者: Bencrie   2018-05-04 14:41:00
都是原 po 不好 XD

Links booklink

Contact Us: admin [ a t ] ucptt.com