c/c++中的条件编译实例
2016-04-11 17:18
344 查看
我们在写程序的过程中老是在头文件用这样的语句:#ifdef 标志符程序段1#else程序段2#endif我们知道这是为了进行条件编译。即当定义了标志符则对程序段1进行编译,而没有定义标志符时则编译程序段2。那么为什么要这要呢?其实这跟事物具有多样性一样。我们需要对不同的状况下采取不同的操作。例如程序的运行平台具有这种多样性,我们在window平台下编写的程序,可能使用某一个库或者与硬件相关的属性、方法。现在要将我们的程序移植到别的计算机系统的时候,例如linux系统。那么程序上依赖的库或者有些和硬件相关联的属性和方法不得不更改,那么我们只能在编写程序的时候提高程序的健壮性,此时就需要条件编译语句为我们实现这样的功能。我们还见过这样的语句段:#ifndef 标志符#define 标志符1#else#define 标志符1#endif或许上面的说法让你有点困惑,还是举个例子吧!#ifndef PI#define DOUBLEPI 3.14*2#else#define DOUBLEPI PI*2#endif问题出现了,为什么不先直接#define PI 3.14,然后在定义DOUBLEPI呢?这就是为了防止变量的重复定义。其实#ifndef的最主要目的是防止头文件的重复包含和编译。那么头文件的重复包含和编译有什么危害吗?有危害是明显的,要不然费这么大劲干嘛呢?其实重复包含头文件有以下问题:使预处理的速度变慢了,要处理很多本来不需要处理的头文件。可能预处理器就陷入死循环了(其实编译器都会规定一个包含层数的上限)。例如
h1.h包含
h2.h,
h2.h又包含
h1.h的情况,如果不采用防止头文件的重复定义,那么预处理器就会进入死循环了。头文件里有些代码不允许重复出现。而重复定义头文件会重复出现一些代码。(虽然变量和函数允许多次声明(只要不是多次定义就行),但头文件里有些代码是不允许多次出现的)。例如:使用
typedef类型定义和结构体Tag定义等,在一个程序文件中只允许出现一次上面是我找网上的但是结合老师的讲解我想举一个例子t1.h
#include "t2.h"int a;int b;t2.h
#include "t1.h"int c;main.cpp
#include<iostream>#include "t2.h"void main(){}它会报错如下:d:\program files\microsoft visual studio\myprojects\ifndef\t1.h(1) : warning C4182: #include nesting level is 362 deep; possible infinite recursiond:\program files\microsoft visual studio\myprojects\ifndef\t1.h(1) : fatal error C1076: compiler limit : internal heap limit reached; use /Zm to specify a higher limit为什么这样呢因为你的t1.h定义了a,c变量,t2.h包含了t1.h,t1.h包含了t2.h,预处理过程会把t2.h的#include “t1.h”变成
int a;int b;int c;也就是直接复制过来然而t1.h又包含了t2.h所以t1.h变成
<pre name="code" class="cpp">int a;int b;int c;int b;int c;这样就重定义了修改如下
t1.h#ifndef T1_H#define T1_Hint a;int b;#endift2.h#include "t1.h"#ifndef T2_H#define T2_Hint c;#endift3.h#include "t2.h"#include "t1.h"int d;main.cpp#include<iostream>#include "t3.h"void main(){}这样就不会报错了
相关文章推荐
- c语言的printf一个小问题
- 【day0411 C++】顺序容器 STL deque类
- C++友元函数访问私有成员
- C语言结构和其他数据形式
- 快速排序算法C语言版
- c++作业3
- C++实验3—多分段函数求值
- 【python】 Windows下pip安装包报错:Microsoft Visual C++ 9.0 is required Unable to find vcvarsall.bat
- C++遍历所有IE浏览器,得到里面的所有元素
- C++递归创建多级目录
- c++获取当前系统时间并输出到文件中
- C++实验3-个人所得税计算器
- C/C++ 头文件以及库的搜索路径
- C++类型强制转换
- c++作业3
- 【C/C++】再探string
- c++实验3,个人所得税
- 《More Effective C++》 Item M1:指针与引用的区别
- C++ 单元测试 Cpputest
- 剑指Offer——单例模式C++实现