今天和朋友讨论一个问题,突然想不明白了

baibaichen 2005-12-22 10:20:28
似乎只有C/C++才有头文件,而其它的语言如C#,JAVA,DELPHI等都没有,有什么这知道这是为什么啊?
...全文
258 22 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
baibaichen 2005-12-22
  • 打赏
  • 举报
回复
呵呵,这到是,DELPHI可以在DCU中放一些信息!谢谢!
汇编,我就不扯了,搞不懂。我想知道的是,这两种不同的方法,有什么好处和短处,它们的目的?
晨星 2005-12-22
  • 打赏
  • 举报
回复
考虑到c具有低级语言的某些特征,c/c++有头文件,恐怕跟汇编有头文件或多或少是有联系的。
偶表示同意。
megaboy 2005-12-22
  • 打赏
  • 举报
回复
谁说只有c/c++才有头文件啊,汇编也有头文件,汇编的头文件后缀名是inc。甚至,汇编也可以使用c/c++的头文件呢(当然一般来说要对头文件中的某些东西进行转换)!考虑到c具有低级语言的某些特征,c/c++有头文件,恐怕跟汇编有头文件或多或少是有联系的。
短歌如风 2005-12-22
  • 打赏
  • 举报
回复
刚刚试了一下,如果只修改Implementation节的内容,依赖于它的单元确实不需要重新编译。要实现这一功能也并不需要“保存有上一次修改文件的备份”,完全可以利用编译生成的DCU中保存的信息,反正这一文件格式也是Borland说了算的。

socrazylee 2005-12-22
  • 打赏
  • 举报
回复
没有头, 说明其他的语言都是四肢发达头脑简单的人用的

^_^

幸亏这里是c/c++版
baibaichen 2005-12-22
  • 打赏
  • 举报
回复
也就是和C++中的HEADER/CPP的关系差不多了吧?EN,回到我的问题为什么只有C/C++才有头文件,这体现了什么设计思路?

另,关于
"
在Delphi中一个单元有Interface节和Implemetation节,如果你只修改了Implemetation节的内容,不会导致依赖于这个单元的其它单元重新编译,不会出现baibaichen所担心的问题。
"
手头没有DELPHI,一时无法验证,只是感觉不太可能,我修改了源文件,编译器如何知道修改的是Implemetation节的内容,而不是Interface节的内容?难到还保存有上一次修改文件的备份?这似乎不可能啊。
短歌如风 2005-12-22
  • 打赏
  • 举报
回复
在Delphi中一个单元有Interface节和Implemetation节,如果你只修改了Implemetation节的内容,不会导致依赖于这个单元的其它单元重新编译,不会出现baibaichen所担心的问题。

感觉上Delphi中的单元其实是把C++中的CPP和H合并为一个文件进行组织了。

在Delphi,有两个Uses段,分别处于Interface节和Implementation节,如果你在Implementation中use了一个单元A,它只是表明你这个单元的实现依赖于单元A,但依赖于你这个单元的其它单元不会因此产生一个对A的依赖;但如果你在Interface节Use了一个单元,则会导致依赖的传递。在interface节的uses可能会导致循环依赖的情况,这时编译器将拒绝工作,需要修改代码,通常会导致产生新的单元,把被依赖的共同部分放进去。
baibaichen 2005-12-22
  • 打赏
  • 举报
回复
TO BluntBlade(无锋之刃·回炉再造)

为什么?实例?
baibaichen 2005-12-22
  • 打赏
  • 举报
回复
唔,使用头文件是为了ODR(一处定义原则),和运行时没有任何关系..。C#从没看过,不过JAVA的import和#include差不多,但,C++中的头文件只有声明,没有实现。然后JAVA、C#和DELPHI却是又有定义,又有实现。
在C++,如果更改了实现,则不需要编译其它编译单元,但需要重LINK。如果更改了声明,则需要编译包含了该声明的所有编译单元。
我觉得在JAVA,C#,编译成中间代码,我不是太清楚,但至少DELPHI应该是有这样的问题的,即我如只修改了实现,可能还是要编译不需要编译的单元。
Kvci 2005-12-22
  • 打赏
  • 举报
回复
DELPHI里有
有个use *****
BluntBlade 2005-12-22
  • 打赏
  • 举报
回复
头文件是一种很恶心的设计……
晨星 2005-12-22
  • 打赏
  • 举报
回复
Java和C#不一样,他们的目标代码中包含元数据,只要你拥有class(jar),或者.net的dll/exe,那么你就可以知道所有的跟你所用的这些class、dll或exe相关的元数据(比如类型信息),根本不需要任何其它文件。
而C/C++中,如果没有常用的组织在头文件中的声明、定义等,仅仅凭借一个一般的obj、lib或者传统的dll,你能做到么?
晨星 2005-12-22
  • 打赏
  • 举报
回复
>>C++的类型信息也可以算是一些简单的元数据
是的,这句没错,我说的元数据很大一部分也就是指类型相关的信息。
但问题是,使用C/C++编程,大多数情况下除了头文件和拷贝/粘帖,你还有别的常用方式可以获得其它模块里的类型信息吗?
晨星 2005-12-22
  • 打赏
  • 举报
回复
仔细想想,前面说得也不对,包括楼主的问题也不对,C/C++并非“必须使用头文件”。
严格地讲,使用头文件纯粹是为了方便组织代码的需要,这里边包括工程上甚至商业上的需要。否则,就C/C++语言和编译器本身来说,不能说就是“必须”。
没有头文件,完全可以编程,只是程序员的日子会变得非常非常非常痛苦。为什么痛苦?试想没有头文件,你就必须在各个源文件之间把公共的声明、类型定义、宏之类的东西拷贝来粘帖去,一个地方改了,所有的都得重新改,那不是痛苦是什么?
而且如果没有头文件,别人发布一个库同时还得发布一段一段地供你拷贝、粘帖的声明和定义,那对发布者和使用者都是痛苦。
所以,C/C++并非“必须”使用头文件。如果有人天生喜欢自虐,那完全可以不使用头文件,到处拷贝/粘帖就行了。

但如果你想深究是什么造成了如果不使用头文件包含机制就会很痛苦,那么原因应该说是两个:
(1)C/C++是一种静态类型的语言;
(2)通常,C/C++编译器编译出的目标文件本身中没有元数据描述。

当然,为什么C/C++语言被设计成了静态语言,为什么C/C++编译器通常都不在目标文件中插入元数据描述,这个话题就扯远了,必须从C/C++语言设计的初衷、设计的目的开始说了。
baibaichen 2005-12-22
  • 打赏
  • 举报
回复
to steedhorse(晨星)
不是吧?扯到那儿去了?带不带元数据和有没有头文件是两回事,C++的类型信息也可以算是一些简单的元数据啊。
sankt 2005-12-22
  • 打赏
  • 举报
回复
学习
dragonzxh 2005-12-22
  • 打赏
  • 举报
回复
偶依旧坚持C/C++是因为比较帅才搞了头文件滴~~~~至于C#,Java之流,明显是不够帅~~~~。。。
晨星 2005-12-22
  • 打赏
  • 举报
回复
Sorry,打错字了,
“因此必需要额外的头文件”->“因此不需要额外的头文件”
汗一个。-_-
晨星 2005-12-22
  • 打赏
  • 举报
回复
楼主有兴趣可以学学COM,当你明白一个COM组件必须怎样做才能够直接被VB、VBScript,Javascript等脚本语言动态调用时,就基本明白一大半了。
晨星 2005-12-22
  • 打赏
  • 举报
回复
C#和Java编译出的目标单元中都自己带着元数据描述,因此必需要额外的头文件。Dephi不太了解。
加载更多回复(2)

15,447

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧