问题:ifndef/define/endif”主要目的是防止头文件的重复包含和编译

========================================================
用法:
.h文件,如下:
#ifndef XX_H
#define XX_H
...
#endif
这样如果有两个地方都包含这个头文件,就不会出现两次包含的情况 。。
因为在第二次包含时 XX_H 已经有定义了,所以就不再 include了
-------------------------------------------------------
#ifndef GRAPHICS_H // 防止graphics.h被重复引用
#define GRAPHICS_H
#include <math.h> // 引用标准库的头文件
…
#include “myheader.h” // 引用非标准库的头文件
…
void Function1(…); // 全局函数声明
…
class Box // 类结构声明
{
…
};
#endif
-----------------------------------------------------
那是指你建立多个文件时,多个文件里都包含这个头文件
-----------------------------------------------------
给你举个例子,再顺便分析一下:
假设你的工程里面有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里面有class D的定义。
这样一来,
编译器编译a.cpp的时候,先根据#include "b.h "去编译b.h这个问题,再根据b.h里面的#include "d.h ",去编译d.h的这个文件,这样就把d.h里面的class D编译了;
然后再根据a.cpp的第二句#include "c.h ",去编译c.h,最终还是会找到的d.h里面的class D,但是class D之前已经编译过了,所以就会报重定义错误。
加上ifndef/define/endif,就可以防止这种重定义错误。
--------------------------------------------------
-------------------------------------------------
1.比如你有两个C文件,这两个C文件都include了同一个头文件。而编译时,这两个C文件要一同编译成一个可运行文件,于是问题来了,大量的声明冲突。 还是把头文件的内容都放在#ifndef和#endif中吧。
不管你的头文件会不会被多个文件引用,你都要加上这个。
一般格式是这样的:
#ifndef <标识>
#define <标识>
......
......
#endif <标识>
在理论上来说可以是自由命名的,但每个头文件的这个“标识”都应该是唯一的。标识的命名规则一般是头文件名全大写,前后加下划线,并把文件名中的“.”也变成下划线,如:stdio.h
#ifndef _STDIO_H_ #define _STDIO_H_ ...... #endif
2.在#ifndef中定义变量出现的问题(一般不定义在#ifndef中)。
#ifndef AAA
#define AAA
...
int i;
...
#endif
里面有一个变量定义在vc中链接时就出现了i重复定义的错误,而在c中成功编译。
原因:
(1).当你第一个使用这个头的.cpp文件生成.obj的时候,int i 在里面定义了当另外一个使用这个的.cpp再次[单独]生成.obj的时候,int i 又被定义然后两个obj被另外一个.cpp也include 这个头的,连接在一起,就会出现重复定义.
(2).把源程序文件扩展名改成.c后,VC按照C语言的语法对源程序进行编译,而不是C++。在C语言中,若是遇到多个int i,则自动认为其中一个是定义,其他的是声明。
(3).C语言和C++语言连接结果不同,可能(猜测)在进行编译的时候,C++语言将全局变量默认为强符号,所以连接出错。C语言则依照是否初始化进行强弱的判断的。
参考解决方法:
(1).把源程序文件扩展名改成.c。
(2).推荐解决方案: .h中只声明 extern int i;
在.cpp中定义
#ifndef __X_H__
#define __X_H__
extern int i;
#endif //__X_H__ int i;
注意问题:变量一般不要定义在.h文件中。
以上就是小编为大家带来的浅谈#ifndef,#define,#endif的作用和用法全部内容了,希望大家多多支持~
# ifndef
# define
# endif
# 全面了解#pragma once与 #ifndef的区别
# C++ 中pragma once 与 #ifndef _XXX_H_ #define _XXX_H_
# 头文件
# 多个
# 下划线
# 这两个
# 另外一个
# 会报
# 使用这个
# 的是
# 都是
# 文件扩展名
# 就会
# 来了
# 放在
# 给你
# 过了
# 第一个
# 都要
# 是这样
# 是指
# 当你
相关文章:
如何在沈阳梯子盘古建站优化SEO排名与功能模块?
公司网站制作费用多少,为公司建立一个网站需要哪些费用?
头像制作网站在线制作软件,dw网页背景图像怎么设置?
智能起名网站制作软件有哪些,制作logo的软件?
如何用狗爹虚拟主机快速搭建网站?
如何通过网站建站时间优化SEO与用户体验?
,购物网站怎么盈利呢?
如何选择高效响应式自助建站源码系统?
专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?
建站之星如何开启自定义404页面避免用户流失?
如何快速生成凡客建站的专业级图册?
常州自助建站:操作简便模板丰富,企业个人快速搭建网站
如何在腾讯云免费申请建站?
制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?
如何批量查询域名的建站时间记录?
为什么Go需要go mod文件_Go go mod文件作用说明
如何续费美橙建站之星域名及服务?
如何通过FTP空间快速搭建安全高效网站?
详解jQuery停止动画——stop()方法的使用
昆明网站制作哪家好,昆明公租房申请网上登录入口?
中山网站制作网页,中山新生登记系统登记流程?
专业公司网站制作公司,用什么语言做企业网站比较好?
大学网站设计制作软件有哪些,如何将网站制作成自己app?
建站之星导航配置指南:自助建站与SEO优化全解析
Android自定义listview布局实现上拉加载下拉刷新功能
html制作网站的步骤有哪些,iapp如何添加网页?
建站DNS解析失败?如何正确配置域名服务器?
SQL查询语句优化的实用方法总结
安云自助建站系统如何快速提升SEO排名?
网页设计网站制作软件,microsoft office哪个可以创建网页?
教程网站设计制作软件,怎么创建自己的一个网站?
香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化
如何破解联通资金短缺导致的基站建设难题?
婚礼视频制作网站,学习*后期制作的网站有哪些?
北京网站制作网页,网站升级改版需要多久?
Swift中循环语句中的转移语句 break 和 continue
linux top下的 minerd 木马清除方法
南阳网站制作公司推荐,小学电子版试卷去哪里找资源好?
如何选择建站程序?包含哪些必备功能与类型?
建站之星如何防范黑客攻击与数据泄露?
文字头像制作网站推荐软件,醒图能自动配文字吗?
Thinkphp 中 distinct 的用法解析
唐山网站制作公司有哪些,唐山找工作哪个网站最靠谱?
关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)
如何解决VPS建站LNMP环境配置常见问题?
如何做网站制作流程,*游戏网站怎么搭建?
公众号网站制作网页,微信公众号怎么制作?
网站制作模板下载什么软件,ppt模板免费下载网站?
香港网站服务器数量如何影响SEO优化效果?
*请认真填写需求信息,我们会在24小时内与您取得联系。