浅谈#ifndef~#define~#endif~的作用

 /*
#ifndef _STDAFX_H
#define _STDAFX_H

#include<iostream.h>         //cin  cout
#include<malloc.h>           //malloc  free
#include<string.h>           //strcpy
#include<stdlib.h>           //exit()

#endif
*/  

1)内容:在头文件(StdAfx.h)开头写上两行:

#ifndef _STDAFX_H

#define _STDAFX_H//一般是文件名的大写

············

············

头文件结尾写上一行:

#endif

2)作用: 主要目的是防止头文件的重复包含和编译

例如:

假设你的工程里面有4个文件,分别是 a.cpp , b.h,  c.h,   d.h。 
a.cpp的头部是: 
#include   "b.h " 
#include   "c.h " 
b.h和c.h的头部都是: 
#include   "d.h " d.h里面有int a,即a的定义。 这样一来, 编译器编译a.cpp的时候,先根据#include   "b.h "去编译b.h这个文件,再根据b.h里面的#include   "d.h ",去编译d.h的这个文件,这样就把d.h里面的int a编译了; 然后再根据a.cpp的第二句#include   "c.h ",去编译c.h,最终还是会找到的d.h里面的int a,但是int a之前已经编译过了,所以就会报重定义错误。 

加上ifndef/define/endif,就可以防止这种重定义错误。

3)另外还有一点需要注意:

在其他文件如main.cpp在使用StdAfx.h的同时又用到其他函数库时,要注意函数库放的位置

如:

main.cpp:

#include<stdio.h>

#include"StdAfx.h"

.........

运行时会出现错误!!!!原因:

编译器通过一个头文件stdafx.h来使用预编译头文件。编译器认为,所有在指令#include"stdafx.h"前的代码都是预编译的,它跳过#include"stdafx.h"指令,使用projectname.pch编译这条指令之后的所有代码。

因此,所有的MFC实现文件第一条语句都是:#include"stdafx.h"。在它前面的所有代码将被忽略,所以其他的头文件应该在这一行后面被包含。否则,你将会得到“Nosuchfileordirectory”这样让你百思不得其解的错误提示。

所以要把#include"StdAfx.h"放在最前面(下面是正确的形式)

main.cpp:

#include"StdAfx.h"

#include<stdio.h>

.........

 

  • 9
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值