====
[原创回答团]
4. 头文件与源文件 理解C文件与头文件(即.h)有什么不同之处,明编译器的工作过程,一般编译器会做以下几个过程:
1.预处理阶段
2.词法与语法分析阶段
3.编译阶段,首先编译成纯汇编语句,再将之汇编成跟CPU相关的二进制码,生成各个目标文件 (.obj文件)
4.连接阶段,各个目标文件中的各段代码进行绝对地址定位,生成跟特定平台相关的可执行文件,用objcopy生成纯二进制码,也就是去掉了文件格式信息 。(生成.exe文件)编译器在编译时是以C文件为单位进行的,项目中一个C文件没有,项目将无法编译,连接器是以目标文件为单位,一个或
多个目标文件进行函数与变量的重定位,生成最终的可执行文件 。
(main .c文件 目标文件 可执行文件 )
编译阶段,头文件中的test变量扫描进了一个中
间C文件,test变量就变成了这个文件中的一个全局变量,所有中间C文件的所有变量,函数分配空间,各个函数编译成二进制码,格式的目标文件中进行各个全局变量,函数的符号描述,二进制码按照一定的标准组织成一个目标文件 。
连接阶段,生成的各个目标文件,根据一些参数,连接生成最终的可执行文件 。
5. 头文件和源文件的问题 其实原因很简单:
a = 10; 这句赋值语句写在了函数的外面 。。。。肯定编译会错,
而且,C/C++编程习惯上不要把变量定义写在头文件 。因为这个头文件被多个C单元INCLUDE后,就是重复定义,编译链接那步就会报错 。
正确的做法是在头文件里写变量声明(注意理解声明与定义这两个词的区别)
在变量定义写在C/CPP文件里 。
//-------------------------------------
#include <iostream>
using std::cout;
using std::endl;
extern int a; //这儿是声明
//--------------------------
#include "dd.h"
int a=10; //这儿是定义,分配空间并初始化
int main ()
{
cout <<a <<endl;
return 0;
}
6. C++中为什么要头文件和源文件分开写呢 一般都是代表一个基本功能的源文件引用相应的头文件 。
一个 相关功能的模块可能有若干对源文件和头文件组成 。这是基于组件编程的核心 。
在我看来,他的好处是巨大的,是java不可比拟的,也是不可复制的:
c语言中头文件中一般定义了函数的声明、结构体的定义、宏定义 。(常量和全局变量最好放到源文件中)
1) 从业务扩展性上看:头文件中放函数的声明,函数由源文件实现,这就是将面向接口编程:接口和实现分开,这在面对业务变更频繁的需求中技术实现的好处是显而易见的--只要定义出良好地、扩展性高的接口,实现是可以很方便的更换 。
2) 从程序架构上看:代码在在大型程序中 需要分成不同的模块,单一模块中又可能分为不同的业务功能单元,他们间有很多相互的调用 。
头文件中的方法声明、结构体定义、宏就都可以充当这部分的模块与模块间、业务功能单位间的接口调用 。模块与模块间,功能单元与功能单元间都是面向接口的调用,耦合性低,这正是基于组件编程的核心思想 。
3) 从某些技术角度实现上看:头文件可通过宏定义来保证类定义、结构体定义、宏定义的唯一性 。确实很方便,不容易出错 。
在用makefile编译程序时,各个功能单元单独编译,构成中间文件.最终这些中间文件链接成可执行程序,在这些中间文件中重复引用同一头文件是不可避免的 。但如果头文件有保护性编程就可以很容易保证类、结构体、宏定义的唯一性 ----最终链接成可执行程序时,可执行程序中代码区中只会有唯一的类、结构体、宏的定义,其他都因为不满足唯一性保护失效 。这样的实现是不是很‘优雅’:)))? 我不知道你是否是这样认为,至于我,我是这样认为,haha~
- 大芋头的吃法 大芋头的10种最佳吃法
- 抠门与节俭的区别 节俭和抠门男人的区别
- 电风扇摇头停不下来怎么修 电风扇不摇头怎么修
- 一月开什么花 一月开什么花和什么花
- word文档双箭头符号怎么打 word中箭头符号怎么打
- 百里香调料和千里香的调料有什么区别 百里香是什么调料
- 桫椤树图片和生长习性
- 柳蒿芽的介绍
- 粉黛眉是什么眉 仙雾眉和粉黛眉
- 安耐晒防晒乳和防晒霜的区别 雅漾防晒和安耐晒防晒霜哪个更好