免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: whelysee
打印 上一主题 下一主题

[C] 谭浩强的书我就不说什么了,居然教学生include一个.c文件 [复制链接]

论坛徽章:
0
201 [报告]
发表于 2011-09-14 14:43 |只看该作者
很好很强大,明白村长的意思,反对那些满嘴脏话的。真理越辩越明,不是骂出来的。

论坛徽章:
2
技术图书徽章
日期:2013-09-04 15:21:51酉鸡
日期:2013-11-01 21:20:20
202 [报告]
发表于 2011-09-14 15:01 |只看该作者
帖子一路看来,看的我呕吐
cjaizss 发表于 2011-09-13 21:27



标题决定非高难度技术贴,因此高楼必有数层斗嘴耍贫。所以进门先看大厅,然后直接到顶,没必要每层停留。

论坛徽章:
17
水瓶座
日期:2013-08-29 12:09:27白羊座
日期:2014-08-07 12:36:42丑牛
日期:2014-07-24 12:44:41寅虎
日期:2014-04-16 16:15:33寅虎
日期:2014-03-12 09:28:43摩羯座
日期:2014-03-06 13:22:04技术图书徽章
日期:2014-03-06 11:34:50天蝎座
日期:2014-01-09 11:31:44寅虎
日期:2013-12-27 17:01:44双子座
日期:2013-12-27 12:32:29双子座
日期:2013-12-25 09:03:33丑牛
日期:2013-12-24 16:18:44
203 [报告]
发表于 2011-09-14 15:52 |只看该作者
include .c文件是比较不够标准的做法,一般也应该抵制。

不过万事不绝对,大家看看linux内核中同样也有include .c的时候:
  1. #include <linux/kernel.h>
  2. #include <linux/utsname.h>

  3. #include "u_audio.h"

  4. #define DRIVER_DESC                "Linux USB Audio Gadget"
  5. #define DRIVER_VERSION                "Dec 18, 2008"

  6. /*-------------------------------------------------------------------------*/

  7. /*
  8. * Kbuild is not very cooperative with respect to linking separately
  9. * compiled library objects into one module.  So for now we won't use
  10. * separate compilation ... ensuring init/exit sections work to shrink
  11. * the runtime footprint, and giving us at least some parts of what
  12. * a "gcc --combine ... part1.c part2.c part3.c ... " build would.
  13. */
  14. #include "composite.c"
  15. #include "usbstring.c"
  16. #include "config.c"
  17. #include "epautoconf.c"

  18. #include "u_audio.c"
  19. #include "f_audio.c"
复制代码

论坛徽章:
0
204 [报告]
发表于 2011-09-14 16:13 |只看该作者
回复 203# asuka2001

这个所谓的“include c”案例仅仅是gcc --combine ... part1.c part2.c part3.c ...的替代。

它要解决的东西在注释中已经说明:Kbuild 不能很好支持“链接大量分开编译的对象到同一个模块”,所以才不再采用分开编译方式。

之所以不直接把所有这些.c文件都放在同一个文件里,原因大概是太过庞大的文件不好维护;但这个做法在本质上就相当于把所有这些.c的内容都写在那一大段注释的下方,这和一般的include .h的目的完全不同。

论坛徽章:
17
水瓶座
日期:2013-08-29 12:09:27白羊座
日期:2014-08-07 12:36:42丑牛
日期:2014-07-24 12:44:41寅虎
日期:2014-04-16 16:15:33寅虎
日期:2014-03-12 09:28:43摩羯座
日期:2014-03-06 13:22:04技术图书徽章
日期:2014-03-06 11:34:50天蝎座
日期:2014-01-09 11:31:44寅虎
日期:2013-12-27 17:01:44双子座
日期:2013-12-27 12:32:29双子座
日期:2013-12-25 09:03:33丑牛
日期:2013-12-24 16:18:44
205 [报告]
发表于 2011-09-14 16:17 |只看该作者
本帖最后由 asuka2001 于 2011-09-14 16:37 编辑

我仅仅只想说明#include .c不是“绝对”不能出现的。

有的时候因为某些原因而妥协,只要你“完全明白”自己在干什么,这也不是万恶的事。

我觉得真正应该清楚明白的:

1. c语言本身是允许#include .c!
2. #include .c是不规范的做法,因该抵制!
3. 抵制#include .c的原因是什么!

至于#include .c出现于否,其实没有太多争论的必要。
大师们include了,自然有他们不得不为之的原因!但是不代表你可以随便的#include .c。

论坛徽章:
0
206 [报告]
发表于 2011-09-14 16:40 |只看该作者
本帖最后由 狗蛋 于 2011-09-14 16:53 编辑

回复 205# asuka2001


    是的。关键在于目的。

对编译器来说,你弄个c文件取名叫xxx.java传给gcc,它一样当c给你编译了。所以扩展名对编译器毫无意义。

那么为何又要区分它呢?
区分的原因,是人们认识到有“分别管理实现文件和接口声明”的需要;至于为何要区分接口和实现,则有几个重要原因,比如1、接口确定后不能随便更改,但隐藏于其后的实现就无所谓了;2、接口声明重复包含不会出错,实现代码多次包含就无法编译

所以,不include .c并不是关于扩展名的争论,而是有无必要严格区分接口和实现的争论。对谭include .c的批评,也不是基于扩展名的批评——前面说过了,编译器管你include .java呢——而是他完全不知道区分接口和实现的重要意义,甚至还发现新大陆一样教人把include .c当作一个功能,甚至是千方百计为这个如此zhuangbility的“功能”找到非用不可的理由以满足自己zhuangbility的心理需求——教出这样的学生,不得不说这是谭的一个罪过。

实质上,看看之前的回帖。反对include .c的,没有人会说是因为这样编译器无法工作,而都认为这个做法违反了基本的接口和实现分别对待的规范。

至于你找的那个内核模块的源码,它虽然include了.c文件,但却完全没有违反接口和实现分别对待的规范。

论坛徽章:
17
水瓶座
日期:2013-08-29 12:09:27白羊座
日期:2014-08-07 12:36:42丑牛
日期:2014-07-24 12:44:41寅虎
日期:2014-04-16 16:15:33寅虎
日期:2014-03-12 09:28:43摩羯座
日期:2014-03-06 13:22:04技术图书徽章
日期:2014-03-06 11:34:50天蝎座
日期:2014-01-09 11:31:44寅虎
日期:2013-12-27 17:01:44双子座
日期:2013-12-27 12:32:29双子座
日期:2013-12-25 09:03:33丑牛
日期:2013-12-24 16:18:44
207 [报告]
发表于 2011-09-14 16:44 |只看该作者
回复 206# 狗蛋

非常赞同你的观点,说的非常清晰透彻!

论坛徽章:
0
208 [报告]
发表于 2011-09-14 17:42 |只看该作者
无所谓的事情,如果有必要,你还可以include 一个 .x文件

论坛徽章:
0
209 [报告]
发表于 2011-09-14 17:44 |只看该作者
小项目,有的时候,不值得花时间去处理,大项目,尽量别这么做

论坛徽章:
0
210 [报告]
发表于 2011-09-14 17:59 |只看该作者
只要文本文件就可以#include
但#include 通常用于代码的组织
#include *.c确实不是常规用法
如果出于项目需要倒也无可厚非
但如果是为了介绍#include 预处理命令
我认为#include *.c确实传递给读者的确实是错误的信息
这个东西一定要结合具体的用法来讲
没有语法错和懂得恰当地应用是两码事
只告诉读者语法而不告诉读者应该在什么条件下应当如何应用
我认为是不负责任的
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP