原文链接:http://wenku.baidu.com/link?url=c4doqVo3U429RkwTN5eaJIfD2rEu-1bLKKQXuqO8drmL359PhUjVmzC7P94wBY90bqYjPBRiuujahij4AM_06OkiOThB3v91fXexqpIukG_

定义 
#ifndef x

#define x

...

#endif 
  这是宏定义的一种,它可以根据是否已经定义了一个变量来进行分支选择,一般用于调试等等.实际上确切的说这应该是预处理功能中三种(宏定义,文件包含和条件编译)中的一种----条件编译。 C语言在对程序进行编译时,会先根据预处理命令进行“预处理”。C语言编译系统包括预处理,编译和链接等部分。

#ifndef x 
  //先测试x是否被宏定义过

#define x  
  //如果没有宏定义下面就宏定义x并编译下面的语句

...

#endif 
  //如果已经定义了则编译#endif后面的语句 
  条件指示符#ifndef检查预编译常量在前面是否已经被宏定义。如果在前面没有被宏定义,则条件指示符的值为真,于是从#ifndef到#endif之间的所有语句都被包含进来进行编译处理。相反,如果#ifndef指示符的值为假,则它与#endif指示符之间的行将被忽略。条件指示符#ifndef 的最主要目的是防止头文件的重复包含和编译。

补充一些内容  
  千万不要忽略了头件的中的#ifndef,这是一个很关键的东西。比如你有两个C文件,这两个C文件都include了同一个头文件。而编译时,这两个C文件要一同编译成一个可运行文件,于是问题来了,大量的声明冲突。  
  还是把头文件的内容都放在#ifndef和#endif中吧。不管你的头文件会不会被多个文件引用,你都要加上这个。一般格式是这样的:    #ifndef <标识>    #define <标识>    ......    #endif  
  <标识>在理论上来说可以是自由命名的,但每个头文件的这个“标识”都应该是唯一的。标识的命名规则一般是头文件名全大写,前后加下划线,并把文件名中的“.”也变成下划线,如:stdio.h

#ifndef _STDIO_H_

#define _STDIO_H_    ......

#endif 
#ifndef xxx//如果没有定义xxx #define xxx//定义xxx #endif //结束如果 
这个用法主要是在头文件中,主要是为了防止类重复的include,所以在类的头文件之前加上前面两个,用类名替代xxx,在最后加上最后一句。 const 与 #define的比较 
    C++ 语言可以用const来定义常量,也可以用 #define来定义常量。但是前者比后者有更多的优点: 
(1)       const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误(边际效应)。 
 
(2)       有些集成化的调试工具可以对const常量进行调试,但是不能对宏常量进行调试。 
        在C++ 程序中只使用const常量而不使用宏常量,即const常量完全取代宏常量。

转载于:https://www.cnblogs.com/zywscq/p/4957408.html

(转)#ifndef的用法相关推荐

  1. C语言#if、##ifdef、#ifndef的用法详解,C语言条件编译详解

    假如现在要开发一个C语言程序,让它输出红色的文字,并且要求跨平台,在 Windows 和 Linux 下都能运行,怎么办呢? 这个程序的难点在于,不同平台下控制文字颜色的代码不一样,我们必须要能够识别 ...

  2. [C/C++]#ifndef,#define用法

    文件中的#ifndef 头件的中的#ifndef,这是一个很关键的东西.比如你有两个C文件,这两个C文件都include了同一个头文件.而编译时,这两个C文件要一同编译成一个可运行文件,于是问题来了, ...

  3. C语言进阶-ifndef的用法

    1.ifndef是 if not define 的缩写 2.用法 #ifndef x //先测试x是否被宏定义过 #define x 程序段1 //如果x没有被宏定义过,定义x,并编译程序段 1 #e ...

  4. #ifndef的用法

    作用:防止头文件的重复包含和编译 定义 #ifndef x #define x  ... #endif 这是宏定义的一种,它可以根据是否已经定义了一个变量来进行分支选择,一般用于调试等等.实际上确切的 ...

  5. #ifdef #else #endif #fi #ifndef 的用法

    预处理就是在进行编译的第一遍词法扫描和语法分析之前所作的工作.说白了,就是对源文件进行编译前,先对预处理部分进行处理,然后对处理后的代码进行编译.这样做的好处是,经过处理后的代码,将会变的很精短.   ...

  6. #ifdef和#ifndef的用法—详细解答

    举一个使用 #ifdef 和 #ifndef 的例子: #ifndef MY_HEADER_H #define MY_HEADER_H// 这里是头文件的内容#endif 这个例子中,#ifndef ...

  7. 关于ifndef...endif用法的详解和补充

    ** (直接看加粗的部分,if not define如果之前没有定义这个的话) 具体示例 1. #ifndef x #define x //定义一个宏 - #endif //C语言在对程序进行编译时, ...

  8. #ifdef ...#else...#endif等条件编译用法

    1.#if相关用法: #if 1 // 执行以下代码代码; #endif#if 0 // 不执行以下代码,一般用于临时调试屏蔽语句使用代码; #endif 2.#ifdef相关用法: #ifdef x ...

  9. #ifdef,#else,#endif,#if用法详解(转)

    #ifdef,#else,#endif,#if用法详解(转) 2011-04-22 10:11 预处理就是在进行编译的第一遍词法扫描和语法分析之前所作的工作.说白了,就是对源文件进行编译前,先对预处理 ...

最新文章

  1. 罗达克氏血液学: 临床原理与应用 Rodak‘s Hematology: Clinical Principles and Applications
  2. 五分钟搞懂MySQL索引下推
  3. jq点击事件多次响应_分享同一个按钮jQuery多次点击实现不同事件的代码
  4. 这些超好用的 Mac 系统自带软件,来试试
  5. dw中创建java程序_Java创建对象的过程简介
  6. Element-UI下拉框select实现拼音搜索
  7. 牛客小白月赛2 J 美 【构造】
  8. 如何删除GitHub中的所有提交历史记录?
  9. 【树莓派不吃灰】基础篇⑲ 搭建usb摄像头MJPG-streamer图片流监控,支持远程视频监控访问
  10. zigbee协议重要英文缩写
  11. 【BZOJ】1535: [POI2005]Sza-Template
  12. 凸优化学习(二)——凸集
  13. 在linux系统中使用WoeUSB工具制作U盘启动盘
  14. [渝粤教育] 山东大学 2021秋中国武术文化(艺术英语) 参考 资料
  15. Visual C++ 2013 and Visual C++ Redistributable
  16. 杭州seo优化月底工作总结
  17. Linux CFS中的进程调度
  18. SDN 岗位轮换实验报告
  19. 华为[ENSP]VLAN常用配置命令
  20. WPF中WrapPanel、StackPanel等添加滚动条ScrollViewer

热门文章

  1. jQuery学习笔记系列(三)——事件注册、事件处理、事件对象、拷贝对象、多库共存、jQuery插件、toDoList综合案例
  2. Web框架——Flask系列之模板使用练习(六)
  3. 天池 在线编程 双向取数(博弈DP)
  4. 策略模式java 用例_java策略模式简单用例
  5. pythonb超分辨成像_深度原理与框架-图像超分辨重构-tensorlayer
  6. 【机器学习】sklearn数据特征预处理:归一化和标准化
  7. 吴恩达入驻知乎,涨粉秒过万!知乎首答:如何系统学习机器学习
  8. 推荐几个NLP出论文的好方向!!
  9. 谈谈神经网络的大规模训练优化
  10. 一位老师,一位领导,一个让全体学生考上目标学校的故事