程序编译过程、头文件、源文件的处理

程序编译顺序如下图所示:

在这里需要着重强调下:头文件的    包含指令#include.
例1:
一个工程中,只有xxxx.c和xxxx.h两个文件。在xxx.c这个源程序中,程序如下:
#include “xxxx.h”
……….
……….
// end of file
这个源程序在编译预处理的时候,包含了xxxx.h这个头文件,可以理解为将这个头文件中的内容全部复制到这个源文件的#include “xxxx.h”的位置,然后进行其他的编译工作。
例2:
一个工程中,有main.c、config.h、aaaa.c、aaaa.h、bbbb.c、bbbb.h、dddd.c、dddd.h、eeee.c、eeee.h,一共10个文件。
其中config.h这个头文件这样定义的:
………….
#include “aaaa.h” 
#include “bbbb.h” 
#include “dddd.h” 
#include “eeee.h”
…………..
在main.c及其他的源文件都如此写: 
#include “config.h”

……….
……….
// end of file
任何一个源程序在编译预处理的时候,都包含了config.h这个头文件,而这个头文件又都包含了aaaa.h、bbbb.h、dddd.h、eeee.h这4个头文件。可以理解为将这些头文件中的内容全部复制到这个源文件的#include “config.h”的位置,然后进行其他的编译工作。
 

疑问1:
每个头文件中都有  防重复编译的机制,
那么,在第一次编译main.c这个源文件,上述的头文件都会被定义的,等第二次编译aaaa.c这个源文件时,上述头文件因为已经被定义了,所以那些头文件中程序不会再次被编译?
那么,aaaa.c这个源文件中怎么调用上述头文件中的变量和声明?

如果说,这个防重复编译的机制    针对的是每一个源文件内不能进行重复编译的话,那么就可以说的通了,就是说,每个源文件对头文件的引用是互不关联的。

 

疑问2:
头文件中只能声明变量和函数,不能定义变量和函数吗?
头文件内含    宏定义、头文件包含、变量定义、结构体定义、变量声明、结构体声明、函数声明等内容;
源文件内含    函数实现、变量定义等内容。
假设头文件中有如下机制作为处理:
#ifdef GLOBAL_XXXX
    #define XXXX_EXT
#else
    #define XXXX_EXT extern
#endif
XXXX_EXT int adobe;
XXXX_EXT int meimei(int x);

假设在xxxx.c这个文件中,宏定义了GLOBAL_XXXX,在yyyy.c这个文件中没有对此进行宏定义,但是这两个源文件都包含了这个头文件。开始分析了:
在编译xxxx.c这个文件时:相当于在源文件最上方直接添加了:
int adobe;                // 这个是变量定义
int meimei(int x);            // 这个是函数声明

在编译yyyy.c这个文件时:相当于在源文件最上方直接添加了:
extern int adobe;            // 这个是变量声明,而且是外部变量声明
extern int meimei(int x);        // 这个是函数声明,而且是外部函数声明

为什么不能进行函数定义在头文件里面呢?
如果在头文件定义函数的话,就会导致函数会被多次定义而产生冲突(因为该头文件会被多次引用)。
变量就没问题了,在本属源文件中属于定义,在其余源文件中属于声明,不存在多次定义的情况发生。

 

疑问3:
上述疑问2的措施都在编译过程中处理的,每个源文件当需要某些外部变量或者函数时,只要能找到对应的外部声明就不会报错,不需找到定义的部分。
找到定义的部分是在链接处理过程中做的,若是外部的声明找不到对应的定义部分,就会报错。

思考下变量的定义在什么地方。
一定自身要清楚,每次在源程序进行编译的过程中,是直接将头文件的内容先复制过来,然后生成目标文件,其余文件找这个外部变量的定义时,就会找到该目标文件来。
 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值