由C中函数调用的函数声明想到的

c语言的函数调用中,如果主调函数调用一个其他函数,则这个函数要么在主调函数之前定义,要么在主调函数之前或者之中做出声明。

运用函数声明的好处是,可以在编译阶段检查出一些不必要的错误。

应该明确:

头文件为相关声明提供了一个集中存放的位置,而并没有函数体的源码。

预处理命令#include的作用是将被包含文件的内容全部复制到当前文件中。

命名空间是为了解决名字冲突问题后期引入的。跟java中包的概念类似。

 

接下来会产生一个问题,头文件只是声明函数,为什么引入头文件就可以使用其中的函数?假如被调函数和主调函数在同一个.c文件内,编译阶段容易找到被调函数的源码,如果被调函数和主调函数不在同一个.c文件内呢?怎么去找被调函数的源码?看头文件中的内容好像并没有提供这样的功能。

上述的这个问题正是链接阶段要解决的。即怎么找到被调函数的函数体。在c中表现为合并一个一个的由.c生成的.o文件;在java中表现为加载合并一个个的.class文件。

其实学过c再学java的人应该有疑惑,为啥java中从来不提链接阶段啊?并且也没有显式的链接命令

 

头文件和函数声明在java中是不存在的,因为java是完全面向对象的,任何一个方法都包含在一个特定的类中。并且java采用动态编译技术,即只有当运行用到该类时,该类才被编译,这样在编译阶段很容易确定对一个方法的引用是否正确。确切点说这里的编译并非.java 到.class 文件的前端编译, 而是运行时的包含很多优化措施的后台编译。

在将.class后台编译之前, 有jvm采取双亲委派模式加载.class 文件的过程,加载过程中完成了连接功能,有兴趣的同学可以看看深入理解jvm。

 

而在c中是静态编译,假如不采用函数声明技术,在编译阶段,不是本文件的函数根本发现不了错误,因为你连这个函数在那个文件中定义都不知道。现在的ide很多不存在链接的显式步骤,这样只能等到运行时才能发现错误了。

 

这些内容可作为  第7章链接的先序知识点,应该搞清楚。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值