C++学习笔记(六):关于ifdef 和ifndef的使用
来源:互联网 发布:js读取cookie 编辑:程序博客网 时间:2024/05/20 07:36
在写程序的时候经常看到这么几句话:
#ifndef xxx_xxx_x
#define xxx_xxx_x
....
#endif
自己也一直知道这个是防止头文件重复编译的保护语句,因此自己写程序的时候只要自己写头文件,那不管三七二十一通通把这几句加上,但是其实自己一直不知道为什么加这几句可以达到防止头文件重复编译的功能。今天重新看书,才明白原理。现在本人献丑,稍稍介绍一下。(这个头文件保护功能在C和C++中是一样的,而且用法也一样)
C++中确保头文件多次包含仍旧能够安全工作的常用技术是预处理器(preprocessor),这也是从C语言中继承过来的。在我们用C语言开发单片机、嵌入式等软件时,也经常可以看到这几句话。
C++中头文件保护的方法是依赖于预处理变量的。
预处理变量是由#define指令定义的,比如 #define GET_INFOR_H,则GET_INFOR_H就被称为预处理变量。(注意区分预处理变量与宏定义)
预处理变量只有两种状态,已经定义和还未定义。
#define的作用是将一个名字设定成预处理变量,而#ifndef 和 #ifdef是用来判断预处理变量是否被定义的。就好像if语句一般。对于#ifndef,当且仅当变量未被定义为真,而#ifdef则相反,当且仅当变量已经被定义时为真。而语句检查结果为真,则执行后面的操作,直到遇到#endif结束。举例解释如下,在文件get_infor.h中有如下语句:
#ifndef GET_INFOR_H
#define GET_INFOR_H
#include <iostream>
........
........
#endif
当第一次包含文件get_infor.h时,GET_INFOR_H还未被定义成预处理变量,故#ifndef检查为真,于是预处理器依次处理#ifndef GET_INFOR_H后面的语句,则会执行#define GET_INFOR_H,此时GET_INFOR_H会被定义成预处理变量。故当此文件再次被编译时,#ifndef检查结果变为假,那么此文件将不会再次被编译。
在这整个程序中预处理变量必须是唯一的。虽然其写法可以有很多中,也没有必须的要求,但是考虑到确保预处理变量的唯一性和程序的可读性,通常会基于头文件的名字来定义相应的预处理变量。例如上面的头文件名字为get_infor.h,那么预处理变量则定义为GET_INFOR_H。全部大写也能够较好的确保其唯一性,避免冲突。
另外加一句,头文件即使目前还没有被包含在任何的其他文件中,也应该设置一下头文件保护。头文件保护的做法很简单,也不会增加程序的复杂度。因此,最好养成随手加头文件保护的好习惯,不要一味的纠结于这个程序到底需不需要。
巧用#ifndef不仅可以用于头文件保护还可以用来调试程序,或者写程序的时候如果对于某个语句是否执行需要加限制条件,都可以这种方法。因为 #ifdef 和#endif中间的语句是否执行完全取决于你是否加上#define。
- C++学习笔记(六):关于ifdef 和ifndef的使用
- C++,ifndef和ifdef的区别
- C 和 Object-C中的 #ifdef #ifndef
- 关于define,ifdef,ifndef和undefine
- 关于define、ifdef、ifndef、endif的讲解
- #ifdef的“或”和#ifndef的“与”
- #ifdef、#ifndef、#define与#endif的使用
- #ifdef #ifndef #endif #undef 的使用
- #ifdef、#if defined、#ifndef的使用
- #ifdef,#else,#endif和#ifndef的用法
- #ifdef,#else,#endif和#ifndef的用法
- #ifdef,#else,#endif和#ifndef的用法
- #if、#ifdef、#ifndef的用法和区别
- #if #ifdef和#ifndef的综合应用
- C++ 中ifndef和ifdef的区别
- ifdef ifndef的区别
- C++ #ifndef和#ifdef宏定义的使用及作用介绍
- 关于#define与#ifndef,#ifdef等问题的理解
- Kafka#1:QuickStart
- 新版百度地图定位SDK的接入 以及demo示例的运行
- 如何做好一个项目负责人
- 25行Python来反求触地位移模拟滚动
- Linux Shell 学习笔记(六)---注释/字符串/数组
- C++学习笔记(六):关于ifdef 和ifndef的使用
- jQuery 学习start up
- 奇数阶魔方
- 数据结构JAVA数组的增删改查
- FragmentArgs (让你的Fragment的代码更少)讲解二
- ceph存储 echo的一些命令
- 数据结构JAVA --栈
- Android使用WebView浏览有声音或者视频的网页,关闭WebView之后,声音或者视频不停止的解决办法
- alloc_pages 分配流程解析