浅谈#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配置与使用
网站建设整体流程解析,建站其实很容易!
网站制作价目表怎么做,珍爱网婚介费用多少?

