作者DIE755127 ()
看板C_and_CPP
标题Fw: [问题] 请问C介面跟实作分开的作法
时间Fri Apr 27 22:10:39 2018
※ [本文转录自 Programming 看板 #1QuouicF ]
作者: DIE755127 () 看板: Programming
标题: [问题] 请问C介面跟实作分开的作法
时间: Fri Apr 27 22:05:30 2018
通常一般的习惯a.c会去include a.h
a.c是实作内容 a.h是介面宣告
b.c只需要include a.h就可以使用a的function
但实际上把a.c include a.h的内容拿掉
编译过程link也不会发生问题(虽然这样看起来a.c跟a.h就没有直接关连)
当然如果a.h内还有定义一些struct或常数会被a.c用到
include a.h就是必须的
不过在不考虑上述的情况下
是否a.c要不要去include a.h只剩下coding习惯的问题?
编译过程上没有任何差别?
第二个问题是
去include一个.c档是绝对必须避免的吗?
有甚麽情况下是必须要这样做?(因为有看到有人这样写 但觉得不太合常理)
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 1.163.233.122
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Programming/M.1524837932.A.98F.html
※ 发信站: 批踢踢实业坊(ptt.cc)
※ 转录者: DIE755127 (1.163.233.122), 04/27/2018 22:10:39
1F:推 KanzakiHAria: 可以先宣告原型再实作 04/27 22:19
2F:→ KanzakiHAria: 每个binary只能有一组宣告+实作 04/27 22:20
3F:→ KanzakiHAria: 如果a.c编译成a.o 有没有include a.h就是差原型宣告 04/27 22:21
4F:→ KanzakiHAria: 如果include a.c 之後只要这个区块被include两次 04/27 22:22
5F:→ KanzakiHAria: 就会变成一个binary里面有两份实作 自然会编译失败 04/27 22:23
6F:推 KanzakiHAria: 未include a.h的a.o会失败的情况是 如果改a.h原型 04/27 22:26
7F:→ KanzakiHAria: 因为a.c不知道a.h有变 之後link自然会失败 04/27 22:27
8F:→ KanzakiHAria: 为什麽要用各式各样可能会炸的方法写程式咧? 04/27 22:28
9F:→ DIE755127: 感谢回应 我自己不会这样写 只是trace别人的code看到 04/27 22:32
10F:→ DIE755127: 不过介面改变 有没有include变成一个是compile出错 04/27 22:43
11F:→ DIE755127: 另一个是link出错 不晓得这样理解对吗 04/27 22:43
12F:→ KanzakiHAria: 未来改a.h的时候 因为a.c不会跟上 所以之後对不上 04/27 22:45
13F:→ KanzakiHAria: 静态连结是compiler时期找不到实作 04/27 22:46
14F:→ KanzakiHAria: 动态连结是执行时期炸掉 04/27 22:47
15F:→ DIE755127: 不过就结果来说都是会出问题 好像跟include的关系不大? 04/27 22:51
16F:→ DIE755127: 我自己认知是觉得比较容易影响trace code的直觉性 04/27 22:53
17F:→ KanzakiHAria: 只要能执行就都是合法语法阿 问题是扩充可读维护性 04/27 22:59
18F:→ DIE755127: 会这样问是看到一个c档没有include任何header只有一堆f 04/27 23:32
19F:→ DIE755127: unction 但也不是static function 就搞不太清楚这个c 04/27 23:32
20F:→ DIE755127: 档的目的是什麽 结果别的c档靠着 include分离的header( 04/27 23:32
21F:→ DIE755127: 介面一样)去link他 04/27 23:32
22F:推 Bencrie: 全都是 static function 才奇怪吧 XD 04/27 23:34
23F:→ DIE755127: 对啦 至少要有一个不是 其他static就是为他服务这样 04/27 23:37
24F:推 Bencrie: 没 include 就 call 你会遇到 implicit declaration of 04/27 23:40
25F:→ Bencrie: function。然後堆叠有机会爆炸 04/27 23:40
26F:→ DIE755127: 我看到另个写法是a.c a.h没关联 b.c去include a.c&a.h 04/27 23:52
27F:→ DIE755127: 这样只需要编译b.o 其他要使用的人include a.h 04/27 23:53
28F:→ DIE755127: 这种写法是不是也不太好? 04/27 23:54
29F:→ james732: a.h其实不是给a.c使用,而是给其他需要a.c的人使用的 04/28 01:32
30F:推 Bencrie: include .c 就 redefinition 04/28 02:12
31F:推 enonrick: 1.不include 自己的header 就是烂习惯,不讨论。2.可以 04/28 09:40
32F:→ enonrick: 的话应避免 include 别的header ->yes , 能用 forward d 04/28 09:40
33F:→ enonrick: eclaration 就能解的就不要include 04/28 09:40