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

楼主: DIE755127   2018-04-27 22:10:39
※ [本文转录自 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档是绝对必须避免的吗?
有什么情况下是必须要这样做?(因为有看到有人这样写 但觉得不太合常理)
作者: KanzakiHAria (神崎・H・アリア)   2018-04-27 22:19:00
可以先宣告原型再实作每个binary只能有一组宣告+实作如果a.c编译成a.o 有没有include a.h就是差原型宣告如果include a.c 之后只要这个区块被include两次就会变成一个binary里面有两份实作 自然会编译失败未include a.h的a.o会失败的情况是 如果改a.h原型因为a.c不知道a.h有变 之后link自然会失败为什么要用各式各样可能会炸的方法写程式咧?
楼主: DIE755127   2018-04-27 22:32:00
感谢回应 我自己不会这样写 只是trace别人的code看到不过接口改变 有没有include变成一个是compile出错另一个是link出错 不晓得这样理解对吗
作者: KanzakiHAria (神崎・H・アリア)   2018-04-27 22:45:00
未来改a.h的时候 因为a.c不会跟上 所以之后对不上静态连结是compiler时期找不到实作动态连结是执行时期炸掉
楼主: DIE755127   2018-04-27 22:51:00
不过就结果来说都是会出问题 好像跟include的关系不大?我自己认知是觉得比较容易影响trace code的直觉性
作者: KanzakiHAria (神崎・H・アリア)   2018-04-27 22:59:00
只要能执行就都是合法语法阿 问题是扩充可读维护性
楼主: DIE755127   2018-04-27 23:32:00
会这样问是看到一个c档没有include任何header只有一堆function 但也不是static function 就搞不太清楚这个c档的目的是什么 结果别的c档靠着 include分离的header(接口一样)去link他
作者: Bencrie   2018-04-27 23:34:00
全都是 static function 才奇怪吧 XD
楼主: DIE755127   2018-04-27 23:37:00
对啦 至少要有一个不是 其他static就是为他服务这样
作者: Bencrie   2018-04-27 23:40:00
没 include 就 call 你会遇到 implicit declaration offunction。然后堆叠有机会爆炸
楼主: DIE755127   2018-04-27 23:52:00
我看到另个写法是a.c a.h没关联 b.c去include a.c&a.h这样只需要编译b.o 其他要使用的人include a.h这种写法是不是也不太好?
作者: james732 (好人超)   2018-04-28 01:32:00
a.h其实不是给a.c使用,而是给其他需要a.c的人使用的
作者: Bencrie   2018-04-28 02:12:00
include .c 就 redefinition
作者: enonrick (EnonRick)   2018-04-28 09:40:00
1.不include 自己的header 就是烂习惯,不讨论。2.可以的话应避免 include 别的header ->yes , 能用 forward declaration 就能解的就不要include

Links booklink

Contact Us: admin [ a t ] ucptt.com