全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

浅谈#ifndef,#define,#endif的作用和用法

问题: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小时内与您取得联系。