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

发布时间 - 2026-01-10 22:02:42    点击率:

问题: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_  # 头文件  # 多个  # 下划线  # 这两个  # 另外一个  # 会报  # 使用这个  # 的是  # 都是  # 文件扩展名  # 就会  # 来了  # 放在  # 给你  # 过了  # 第一个  # 都要  # 是这样  # 是指  # 当你 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何使用 Go 正则表达式精准提取括号内首个纯字母标识符(忽略数字与嵌套)  JS中对数组元素进行增删改移的方法总结  Windows10电脑怎么设置虚拟光驱_Win10右键装载ISO镜像文件  Edge浏览器提示“由你的组织管理”怎么解决_去除浏览器托管提示【修复】  大学网站设计制作软件有哪些,如何将网站制作成自己app?  如何在香港免费服务器上快速搭建网站?  php json中文编码为null的解决办法  北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?  如何在腾讯云服务器快速搭建个人网站?  如何在Ubuntu系统下快速搭建WordPress个人网站?  JS去除重复并统计数量的实现方法  猎豹浏览器开发者工具怎么打开 猎豹浏览器F12调试工具使用【前端必备】  UC浏览器如何设置启动页 UC浏览器启动页设置方法  如何用VPS主机快速搭建个人网站?  laravel怎么为API路由添加签名中间件保护_laravel API路由签名中间件保护方法  关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)  中山网站推广排名,中山信息港登录入口?  微博html5版本怎么弄发超话_超话进入入口及发帖格式要求【教程】  如何快速选择适合个人网站的云服务器配置?  如何用西部建站助手快速创建专业网站?  Laravel Octane如何提升性能_使用Laravel Octane加速你的应用  Python文件流缓冲机制_IO性能解析【教程】  如何在IIS7上新建站点并设置安全权限?  百度浏览器网页无法复制文字怎么办 百度浏览器复制修复  详解jQuery停止动画——stop()方法的使用  用yum安装MySQLdb模块的步骤方法  Laravel如何实现一对一模型关联?(Eloquent示例)  如何快速使用云服务器搭建个人网站?  详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)  哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?  Laravel Artisan命令怎么自定义_创建自己的Laravel命令行工具完全指南  🚀拖拽式CMS建站能否实现高效与个性化并存?  Laravel如何处理和验证JSON类型的数据库字段  如何实现建站之星域名转发设置?  php后缀怎么变mp4格式错误_修改扩展名提示格式不对怎么办【技巧】  SQL查询语句优化的实用方法总结  如何安全更换建站之星模板并保留数据?  Laravel Telescope怎么调试_使用Laravel Telescope进行应用监控与调试  如何在自有机房高效搭建专业网站?  夸克浏览器网页跳转延迟怎么办 夸克浏览器跳转优化  Laravel路由怎么定义_Laravel核心路由系统完全入门指南  js实现获取鼠标当前的位置  Python文件异常处理策略_健壮性说明【指导】  猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?  Laravel如何创建自定义Facades?(详细步骤)  微信小程序制作网站有哪些,微信小程序需要做网站吗?  Win11怎么查看显卡温度 Win11任务管理器查看GPU温度【技巧】  Laravel Vite是做什么的_Laravel前端资源打包工具Vite配置与使用  网站建设整体流程解析,建站其实很容易!  网站制作价目表怎么做,珍爱网婚介费用多少?