#ifndef,#define,#end 是宏定义的一种---条件编译

这样我直接举个例子好了:我定义两个相同的类A分别在single.h和singlenew.h

single.h:

 #include <iostream>
using namespace std; class A
{
public:
A()
{
cout<<"Single header Define"<<endl;
}
};

singlenew.h

 #include <iostream>
using namespace std; class A
{
public:
A()
{
cout<<"SingleNew_h header Define"<<endl;
}
};

现在我们写个测试函数定义一个类A的实例,看它究竟会调用哪个:

main.cpp:

 #include "single.h"
#include "singlenew.h"
#include <iostream>
using namespace std; int main()
{
A a;
return ;
}

我们编译一下,咦,出错了:

意思是类A重定义了。

为什么呢:因为我们头文件中包含了single.h和singlenew.h 在这两个头文件中都定义了类A,那么久出现这个错误

现在我们重新给两个头文件加上条件编译:

single.h

 #ifndef _CLASS_A
#define _CLASS_A
#include <iostream>
using namespace std; class A
{
public:
A()
{
cout<<"Single header Define"<<endl;
}
};
#endif

singlenew.h

 #ifndef _CLASS_A
#define _CLASS_A
#include <iostream>
using namespace std; class A
{
public:
A()
{
cout<<"SingleNew_h header Define"<<endl;
}
};
#endif

main.c文件不变,现在我们重新编译运行。

这下正确了吧,当然我们还有个疑问,为什么执行了single.h中定义的类的构造函数。这是因为在主函数中我们先

包含"single.h"再包含"singlenew.h"的原因当在single.h中找到了class A的定义,那么已经有了_CLASS_A这个

宏定义了,再进入"singlenew.h"文件中发现已经有了宏_CLASS_A的定义,于是直接略过该文件中的类A的定义.

不信我们交换single.h和singlenew.h在主函数的位置:就有如下结果了。

这下对了吧。

当然也许你有疑问说不会有人傻到定义两个相同的类。其实条件编译宏定义多数函数用在解决文件重复包含的情

况下。比如类A定义在A.h中 我们在文件B中使用了类A,那么文件B必然要包含A.h 这时如果有个C文件同时用到了

类A和类B是不是要同时包含文件A和文件B呢,然而文件B中已经包含了文件A,此时是不是文件C将包含文件A两

次呢,所以条件编译大多数用在这种情况,当我们的工程很庞大的时候,你会发现会经常出现重复包含相同文件的

问题,所以条件编译在大工程中被广泛应用。

关于#ifndef,#define,#end的说明的更多相关文章

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

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

  2. 头文件里面的ifndef /define/endif的作用

    c,c++里面,头文件里面的ifndef /define/endif的作用 今天和宿舍同学讨论一个小程序,发现有点地方不大懂······ 是关于头文件里面的一些地方: 例如:要编写头文件test.h ...

  3. 转 #ifndef/#define/#endif使用详解

    想必很多人都看过“头文件中的 #ifndef/#define/#endif 防止该头文件被重复引用”.但是是否能理解“被重复引用”是什么意思?是不能在不同的两个文件中使用include来包含这个头文件 ...

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

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

  5. 头文件为什么要加#ifndef #define #endif

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

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

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

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

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

  8. #ifndef#define#endif的用法

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

  9. #ifndef #define #endif 防止头文件被重复引用

    想必很多人都看过“头文件中的 #ifndef/#define/#endif 防止该头文件被重复引用”.但是是否能理解“被重复引用”是什么意思?是不能在不同的两个文件中使用include来包含这个头文件 ...

随机推荐

  1. UVa133.The Dole Queue

    题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  2. Openstack REST API

    There are some high quality resources that already cover the OpenStack API, so this is a YEA (yet an ...

  3. 第06讲- DDMS中logcat的使用

    1.DDMS使用 )Device选项卡 Device中罗列了Emulator中所有的进程,选项卡右上角那一排按钮分别为:调试进程.更新进程.更新进程堆栈信息.停止某个进程. )Threads选项卡   ...

  4. Uboot与Linux之间的参数传递

    U-boot会给Linux Kernel传递很多参数,如:串口,RAM,videofb等.而Linux kernel也会读取和处理这些参数.两者之间通过struct tag来传递参数. U-boot把 ...

  5. 关于echo双引号和单引号的问题

    echo ''; 输出的是变量符号和变量名称. echo"";输出的是变量的值. <?php $s="PAP"; echo "my name i ...

  6. qt坐标系统

    #说明:坐标系统是由 QPainter控制的QPaintDevice是那些能够让 QPainter 进行绘制的“东西”(准确的术语叫做,二维空间)# 的抽象层(其子类有QWidget. QPixmap ...

  7. python - 文件

    ''' 模式 描述 r 以读方式打开文件,可读取文件信息. w 以写方式打开文件,可向文件写入信息.如文件存在,则清空该文件,再写入新内容 a 以追加模式打开文件(即一打开文件,文件指针自动移到文件末 ...

  8. Linux :: vi E212: Can't open file for writing

    Linux :: vi E212: Can't open file for writing sysct1.conf 可能无写权限!查看方法:ls -lh /etc/sysct1.conf如果没有,则c ...

  9. css中的伪类

    伪类用于向某些选择器添加一些特殊效果. 1):focus 伪类在元素获得焦点的时向元素添加特殊样式.一般用于输入文本域,按钮,以及超链接. a:focus{color:red;}超链接字体为红色 in ...

  10. Android----------eclipse常用快捷键

    类级操作:--------------------一个去包,一个导包------------------------------------ Ctrl+shift+O (不是零) 清除没用引用 ctr ...