专业常识

来源:互联网 发布:四旋翼飞行器平衡算法 编辑:程序博客网 时间:2024/05/17 06:39
一.关于.h和.c文件
在C语言家族程序中,头文件被大量使用。一般而言,每个C++/C程序通常由头文件(header files)和定义文件(definition files)组成。头文件作为一种包含功能函数、数据接口声明的载体文件,用于保存程序的声明(declaration),而定义文件用于保存程序的实现 (implementation)。
以下是假设名称为 graphics.h的头文件:#ifndef GRAPHICS_H (作用:防止graphics.h被重复引用)

#define GRAPHICS_H

#include.... (作用:引用标准库的头文件)

...

#include... (作用:引用非标准库的头文件)

...

void Function1(...); (作用:全局函数声明)

...

class Box (作用:类结构声明)

{

...

};

#endif

从以上例子可以看出,头文件一般由三部分内容组成:(1)头文件开头处的版权和版本声明;(2)预处理块;(3)函数和类结构声明等。在头文件中,用 ifndef/define/endif结构产生预处理块,用 #include 格式来引用库的头文件。头文件的这种结构,是利用C语言进行开发软件所通常具备的,属于公有知识。
假设我们有下面这样的一个程序,源代码如下:

/**//* main.c */
#include "mytool1.h"
#include "mytool2.h"
int main(int argc,char **argv)
...{
mytool1_print("hello");
mytool2_print("hello");
}
/**//* mytool1.h */
#ifndef _MYTOOL_1_H
#define _MYTOOL_1_H
void mytool1_print(char *print_str);
#endif
/**//* mytool1.c */
#include "mytool1.h"
void mytool1_print(char *print_str)
...{
printf("This is mytool1 print %s ",print_str);
}
/**//* mytool2.h */
#ifndef _MYTOOL_2_H
#define _MYTOOL_2_H
void mytool2_print(char *print_str);
#endif
/**//* mytool2.c */
#include "mytool2.h"
void mytool2_print(char *print_str)
{
printf("This is mytool2 print %s ",print_str);
}

我们可以这样来编译
gcc -c main.c       
gcc -c mytool1.c
gcc -c mytool2.c
上面的三个命令分别编译了三个c文件,编译过程主要进行词法分析和语法分析。在分析的过程中,发现有不符合要求的词法和语法时,及时报告用户。此时.c文件中的“#include”语句之做了格式检查,并未将相应的.h文件内容加入。
gcc -o main main.o mytool1.o mytool2.o
上面的这条命令是连接过程,将编译过程中生成的目标代码进行连接处理,最后生成可供机器运行的可执行文件。这时会将文件“#include”中包含的头文件的内容加入。
分析:
1.为什么一般在.h文件中要对.c文件中实现的函数作函数说明?
    连接命令将列出的所有文件连接成一个文件,生成可供机器运行的可执行文件,因为在.h文件中对.c文件中的函数做了说明,而主文件中又将.h文件包含,这样就在主函数前进了函数说明!函数声明的作用, 它既告诉程序员如何调用一个函数,也让编译器检查调用与函数原型是否一致。 有些人以为连接器会检查参数匹配的问题,连接不出错就万事大吉了,这是不对的。你想,参数是以寄存器或压栈的方式传递的。编译之后,参数类型和个数等信息都已丢失,连接器还能帮你查错吗? 它只是简单地把名字相同的符号连接起来而已。错误发现的越早越好,编程出现错误是不可避免的。错误发现的越早,修改的成本就越小。 因此原则是:尽量让错误暴露出来(例如严格的编译选项、测试),而不是掩盖或忽视它。 能在编译时发现的错误,不要拖到运行时;能在编辑时发现的错误,不要拖到编译时(许多编辑器的括号匹配、代码补齐等功能就是为了减少这样的错误)。ERROR:菜鸟我以前一直以为在.h文件中要对.c文件中实现的函数作函数说明,是为了在文件中将c文件的内容加入呢!其实将功能c文件的内容与main()文件整合是连接命令的工作。
2..h文件中“#ifndef      
          #define
              
          #endif”的作用? 
原创粉丝点击