头文件,源文件的关系

学习C过程,有许多应注意的细小的点,由于遇到文件引用的一些问题,引发了我的一点思考。
1、预处理阶段:编译器以C文件作为一 个单元,首先读这个C文件,发现第一句与第二句是包含一个头文件,就会在所有搜索路径中寻找这两个文件,找到之后,就会将相应头文件中再去处理宏,变量, 函数声明,嵌套的头文件包含等,检测依赖关系,进行宏替换,看是否有重复定义与声明的情况发生,最后将那些文件中所有的东东全部扫描进这个当前的C文件中,形成一个中间“C文件”
2、编译阶段,会将头文件所在文件夹中所有文件进行“替换”(即所有头文件进行替换),且不会再进行连接。
下面以一个例子作为讲解:
main.cpp

#include<stdio.h>
#include"test.h"
int main()
{
    int j;
    j=doit(3, 4);
    printf("%d", j);
}

test.h

int doit(int n, int m)
{
    int k;
    k = m + n;
    return(k);
}

test.cpp

此时不加代码

运行结果为:
这里写图片描述
此时能正常运行
改为:
mian.cpp

#include<stdio.h>
#include"test.cpp"
int main()
{
    int j;
    j=doit(3, 4);
    printf("%d", j);
}

test.h

无代码

test.cpp

int doit(int n, int m)
{
    int k;
    k = m + n;
    return(k);
}

此时运行出错,提示为:
这里写图片描述
解释如下:
猜测头文件所在文件夹在编译时,进行替换后,就不在进行文件的连接。源文件替换后其实还会生成.o或.obj文件,最后进行与主函数的连接。此时便会出现重复定义的情况,因为替换了一次,又连接了一次。
值得注意的是,并不是.h或者.cpp文件后缀决定了他们这种特性。将例一中.h改为.cpp会发现一样可以运行。
正规书写形式:
main.cpp

#include<stdio.h>
#include"test.cpp"
int main()
{
    int j;
    j=doit(3, 4);
    printf("%d", j);
}

test.h

int doit(int n, int m);

test.cpp

#include"test.h"
int doit(int n, int m)
{
    int k;
    k = m + n;
    return(k);
}

即将声明放到头文件中,实现过程放到.cpp文件中。此时,在main中替换了头文件中的声明,再连接.cpp中的实现则不会出现重复定义。至于这样的好处,请参考这篇博客:
http://blog.csdn.net/faithmai/article/details/54092623

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值