关于#ifndef 和#define的问题

turkeyNUPt 2008-05-31 09:34:26
//b.h文件
#include "a.h"

//c.h文件
#include "a.h"
#include "b.h"

在c.h文件中,a.h文件被包含了两次.而C++规定在同一文件中只能将同一个头文件包含一次.#ifndef,#define,#endif可以避免多次包含同一头文件.

//新的c.h文件
#ifndef C_H_H
#define C_H_H
#include "a.h"
#include "b.h"
...
#endif

编译器连接c.h文件时,第一次遇到a.h文件,名称C_H_H还没有被定义,编译器将查看#ifndef和#endif之间的内容.如果在同一文件中遇到其他包含a.h的代码,编译器将知道C_H_H名称已经被定义了,从而忽略其中的内容.

PS:我对红色部分的解释不是很懂,对于新定义的c.h文件,首先执行#ifndef C_H_H ,发现C_H_H没有定义,接着执行 #define C_H_H ,然后顺序执行#include "a.h" 和#include "b.h",这样不是还是重复引用吗 ?
...全文
155 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
turkeyNUPt 2008-05-31
  • 打赏
  • 举报
回复
5楼你说的很好,谢谢!不过如果我先使用了b.h,显然B_H_H在使用一次后被定义,同时b.h又调用了a.h,那么A_H_H也被定义。之后我再使用c.h,在c.h中预编译a.h和b.h时,由于B_H_H和A_H_H之前都已被定义,那么a.h和b.h的内容将不被c.h展开,那不是c.h不能包含a.h和b.h了吗?
温飞_会员 2008-05-31
  • 打赏
  • 举报
回复
一般一个头文件用一个 #define XX 标记。
#ifndef B_H_H
#define B_H_H
#include "a.h"
//不要再加其他的头文件 ,否则会 乱
#endif


ringphone 2008-05-31
  • 打赏
  • 举报
回复
//新的c.h文件
#ifndef C_H_H
#define C_H_H
#include "a.h"
#include "b.h"
...
#endif
------------------
这个只能防止自己,即c.h被重复包含,因为b.h里面并没有对C_H_H是否定义的判断,因此包含b.h导致a.h又被重复包含。
正确的应该是:
//a.h
#ifndef A_H_H
#define A_H_H
...
#endif

//b.h
#ifndef B_H_H
#define B_H_H
#include "a.h"
...
#endif

这样即使c.h里面没有C_H_H的判断,也能防止a.h或b.h被重复包含,以上面c.h的例子来说,
1、未定义C_H_H,定义C_H_H
2、包含a.h,a.h里面,未定义A_H_H,定义A_H_H
3、包含b.h,b.h里面,未定义B_H_H,定义B_H_H,然后包含a.h,因为A_H_H已定义,因此a.h里面的定义忽略,防止了重复包含
turkeyNUPt 2008-05-31
  • 打赏
  • 举报
回复
谢谢1楼的解释,不过我还不是很明白。你能具体讲下代码运行步骤吗?就是这段代码的意义是什么?
0x16 2008-05-31
  • 打赏
  • 举报
回复
一般用#pragma once 就可以了
devang 2008-05-31
  • 打赏
  • 举报
回复
#ifndef
{
#define
//......
}
#endif
arong1234 2008-05-31
  • 打赏
  • 举报
回复
这种宏只能防止头文件自己(这里是c.h)被重复包含。如果这个文件包含了其他文件,其他文件不被重复包含的责任在于被包含的文件(也就是a.h, b.h)

例如你一个文件包含了c.h文件,则虽然文件被包含了,由于宏的存在,c.h的真正内容不会被重复包含

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧