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