C语言预编译的作用解析
来源:互联网 发布:网络限速软件手机版 编辑:程序博客网 时间:2024/05/02 13:43
预编译一般用来防止头文件的重复包含和编译。
在我们用C做开发的是候,有时候项目很大,我们所编写的程序会很长。这样我们如果还是写在一个文件中会出现管理上的问题和
查看上的不方便。因此,我们可以分多个文件编写我们的程序,这样把一个功能的程序写到一个文件里,便于查看 也有助于我们管理。
如main.c sd.h sd.c lcd.h lcd.c fat.h fat.c delay.h delay.c
至于头文件(sd.h)和源文件(sd.c)的写法应该是这样的:
在具体使用相关函数是可以使用#include 命令来包含其函数所在的头文件。下面我们虚拟如下的一个程序结构来展开说明:
如在main.c中
#include delay.h
#include sd.h
#include lcd.h
#include fat.h
main()
{
}
在sd.c中
void sd_init()
{
}
在sd.h中
#include delay.h
#include .......
void sd_init();
.....
在delay.c中
void delay_nms(UINT n)
{
}
在delay.h中
void delay_nms(UINT n);
.....
我们看,如果在头文件的书写中都没加预编译指令
#ifndef XXXXXXXX
#define XXXXXXXX
#endif
会出现怎么样的情况????
delay_nms()函数定义了一次,当我们在往下,读到#include sd.h时,把sd.h包含进来,在把sd.h的内容展开,我们又读到了一次delay.h
这样又把delay.h的内容包含近了main.c 。因此,我们发现delay.h被main.c重复包含了2次。这样使得void delay_nms()函数也被定义了二次。
如何解决重复定义的问题,我们是用条件编译,#ifndef ..等。在头文件中加入条件编译指令,如下:
在sd.h中
#ifndef _SD_H_
#define _SD_H_
#include delay.h
#include .......
void sd_init();
.....
#endif
在delay.h中
#ifndef _DELAY_H_
#define _DELAY_H_
void delay_nms(UINT n);
.....
#endif
这样,让我们再看下会出现什么情况。
了 _DELAY_H_
则定义了一个_DELAY_H_宏,宏值为NULL. 当我们main.c中再往下,读到#include sd.h时,把sd.h包含进来,在把sd.h的内容展开,
我们又读到了一次delay.h。 这一次 我们判断 #ifndef _DELAY_H_ 结果是已经定义了,这样,编译器会跳过下面的内容,直接到 #endif。
可见,我们的函数 void delay_nms(UINT n); 就不会被重复定义二次! 对于其他的头文件,我们现在也加上预编译指令,防止被重复包含。
- C语言预编译的作用解析
- C语言的预编译
- C语言的预编译
- C语言的预编译
- C语言的预编译
- C语言的预编译
- c语言预编译
- c语言预编译
- c语言预编译
- C语言预编译
- C语言-预编译
- 预编译的作用
- 我的c语言笔记---预编译
- C语言预编译指令的用法
- C语言预编译、宏的整理
- c语言预编译学习
- C语言预编译指令
- C语言 预编译 详解
- 实习16天
- java正则表达式之捕获分组与Back引用
- 图像处理--------应用卷积– 轧花与边缘检测
- Eclipse和InteliJ IDEA 使用区别
- KDB+性能分析:内存篇
- C语言预编译的作用解析
- Java中获得数据库连接的几种方法
- Symantec SEP控制台密码忘了的恢复方法
- iOS 开发之navigationController下子类视图发生位移的解决方法
- centos7 安装配置openstack-dashboard (官网openstack-juno版)
- ZOJ 3434 Hiiragi's Sticks
- BST树、B-树、B+树、B*树
- 图像处理------调整亮度与对比度
- 深入Java关键字null