目的:为了保证包含的内容只被程序(include) 和编译了一次。判断预处理器常量是否已被定义。

预编译将所有头文件(#include"XXX.h")用头文件中的内容来替换,头文件中的内容都已经包含到需要他们的.cpp 中。最后生成.exe文件是由编译和链接两步完成的。编译时源代码生成obj 二进制目标文件的过程,由于编译时独立的,所以在单元里可以有重名的函数。如x.cpp中有void a(), b.cpp中也有 void a(); 编译过程中,只要声明的东西就能使用,不需要定义,声明可以重复。extern 在编译时告诉该编译单元该变量的定义在别的编译单元。在链接时,定义在整个程序中的函数定义只能有一份。

# ifndef : (if not define)

如果有两个c文件,两个c文件都include 了同一个header。在编译时,这两个c文件要一同编译成一个可运行文件,就出现了大量的声明冲突。所以把header中的内容放在# ifndef 和#endif中。

#ifndef <标识>

   #define <标识>

。。。

。。。

#endif

这个标识是自由命名的,但每个header应该是唯一的,一般的规则为header名大写,前加下划线, . 变为下划线。。如 head.h -> _HEAD_H_

假设头文件第一次被引用,_HEAD_H_ 没有被定义,所以就执行宏定义,直到#endif。当该头文件被第二次引用时,_HEAD_H_已经被定义,就不会再执行。

eg.

#ifndef _MYHEAD_H_
#define _MYHEAD_H_
class A;
#endif

x. cpp and y.cpp include the header a.h. Class A can only be defined once.在编译阶段,两个编译单元都会分别包含 a.h。即使使用了#ifndef # define # endif. 这就是为什么当a.h被多个文件包含时,不能在a.h中定义变量及函数的原因,因为在链接阶段会出现重定义。但是在a.h中定义static变量是允许的,因为在a.h中写  static int s=0; 在x.cpp 和y.cpp 中使用s将为两个独立的s。

C 语言中是容忍重复声明的,C++中不可以。

看似 #ifndef #define 没用,但是当x.cpp中多写了多个#include"a.h"时,使用#ifndef #define 在预编译阶段就只会包含一个a.h。eg. 当 x.cpp中包含了 a.h 和b.h, 而a.h 又包含了b.h,那么使用#ifndef # define 就只会包含一份b.h.

相同功能的有:

#pragma once

。。。。

C++ 中 #ifndef, #define, #endif 宏定义的更多相关文章

  1. 头文件中ifndef/define/endif的作用以及#pragma once使用

    例如:要编写头文件test.h 在头文件开头写上两行: #ifndef _TEST_H #define _TEST_H//一般是文件名的大写 ············ ············ 头文件 ...

  2. c/c++头文件中#ifndef/#define/#endif的用法

    想必很多人都看过“头文件中用到的 #ifndef/#define/#endif 来防止该头文件被重复引用”.但是是否能理解“被重复引用”是什么意思?头文件被重复引用了,会产生什么后果?是不是所有的头文 ...

  3. [Windows编程] #pragma once 和#ifndef ... #define ... #endif 比较

    C++中防止头文件被多次include 的常见方式有: 1) 用#ifndef ...  #define ... #endif  宏 #ifndef __MYHEADER_H__#define __M ...

  4. 头文件中的#ifndef/#define/#endif 的作用

    在一个大的软件工程里面,可能会有多个文件同时包含一个头文件,当这些文件编译链接成一个可执行文件时,就会出现大量重定义的错误.在头文件中实用#ifndef #define #endif能避免头文件的重定 ...

  5. C/C++头文件使用 #ifndef #define #endif 的原因

    背景 在编译的时候,出现"redefine"的错误,最后检查才发现对应的头文件没有写正确的预编译信息: #ifndef _HeadFileName_H #define _HeadF ...

  6. C中的预编译宏定义

     可以用宏判断是否为ARC环境 #if _has_feature(objc_arc) #else //MRC #endif C中的预编译宏定义 -- 作者: infobillows 来源:网络 在将一 ...

  7. C++头文件为什么要加#ifndef #define #endif

    #ifndef 在头文件中的作用 在一个大的软件工程里面,可能会有多个文件同时包含一个头文件,当这些文件编译链接成一个可执行文件时 ,就会出现大量“重定义”的错误.在头文件中实用#ifndef #de ...

  8. ifndef/define/endif作用和用法

    问题:ifndef/define/endif”主要目的是防止头文件的重复包含和编译,偶只知道这个概念不懂的是怎么个用法,和为什么要用它~~高手请指点一下~~谢谢~~~!!! ------------- ...

  9. #ifndef#define#endif的用法

    在网上看到了感觉作者总结得很好,作者辛苦了! #ifndef#define#endif的用法 文件中的#ifndef 头件的中的#ifndef,这是一个很关键的东西.比如你有两个C文件,这两个C文件都 ...

随机推荐

  1. 查询数据SELECT 之单表查询

    一.单表查询的语法与关键字的执行优先级""" # 单表查询# 单标查询完整与法:# select distinct(关键字,代表查询的意思,后面跟)字段1,字段2...( ...

  2. 【Java】初始化

    默认域初始化 如果在构造器中没有显示地给域赋予初值,那么就会被自动赋予默认值:数值为0,布尔值为false,对象引用为null. 无参数构造器 很多类都包含一个无参数的构造函数,对象由无参数构造函数创 ...

  3. BZOJ2001 HNOI2010城市建设(线段树分治+LCT)

    一个很显然的思路是把边按时间段拆开线段树分治一下,用lct维护MST.理论上复杂度是O((M+Q)logNlogQ),实际常数爆炸T成狗.正解写不动了. #include<iostream> ...

  4. 今天一天课,随便写点吧/xk

    知道的越多,不知道的也就越多. 最近想学很多很多东西,但是发现没有一个计划,也没有那么多时间精力,都是想到哪学到哪,有的就是学了一半就放下了,又去学新的,感觉需要规划一下学习路线,时间什么的 推荐一个 ...

  5. linux运维、架构之路-linux文件属性

    1.查看文件属性 ls -lhi 文件属性详细说明 1. 第一列: inode索引节点编号 2. 第二列:文件类型及权限 3. 第三列:硬链接数 4. 第四列:文件或目录所属的用户,即文件的所有者 5 ...

  6. 自学Aruba6.1-基本网络参数配置(web页面配置)

    点击返回:自学Aruba之路 自学Aruba6.1-基本网络参数配置(web页面配置) 1 配置VLAN 1.1  新建VLAN Configuration---VLANs中,VLANID选项卡下的A ...

  7. 【Luogu4512】多项式除法(FFT)

    题面 洛谷 题解 模板题... 我直接蒯我写的东西... 这个除法是带余除法,所以并不能直接求逆解决. 要求的就是给定两个多项式\(A(x),B(x)\),其项数为\(n,m\) 求解一个\(n-m\ ...

  8. 【Luogu3803】多项式乘法FFT(FFT)

    题目戳我 一道模板题 自己尝试证明了大部分... 剩下的还是没太证出来... 所以就是一个模板放在这里 以后再来补东西吧.... #include<iostream> #include&l ...

  9. 启用SharePoint 的 web application下面所有站点“备用语言”

    clear $PSSnapin = Add-PsSnapin Microsoft.SharePoint.PowerShell -ErrorAction SilentlyContinue | Out-N ...

  10. hdu3506 Monkey Party (区间dp+四边形不等式优化)

    题意:给n堆石子,每次合并相邻两堆,花费是这两堆的石子个数之和(1和n相邻),求全部合并,最小总花费 若不要求相邻,可以贪心地合并最小的两堆.然而要求相邻就有反例 为了方便,我们可以把n个数再复制一遍 ...