#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. C# 文件夹操作

    追加文件    StreamWriter sw = File.AppendText(Server.MapPath(] != Path.DirectorySeparatorChar)         a ...

  2. 使用WCF实现SOA面向服务编程—— 架构设计

    原文地址:http://www.cnblogs.com/leslies2/archive/2011/03/29/1997889.html SOA本身就是一种面向企业级服务的系统架构,简单来说,SOA就 ...

  3. Javascript或jQuery方法产生任意随机整数

    方法1:javascritp方法 1 2 3 4 5 6 //随机数    function diu_Randomize(b,e){        if(!b && b!=0 || ! ...

  4. 用Less循环生成样式

    需求是这样的,我要给一个轮播图设置不同的背景图,由于每张图片的背景图路劲都不一样,所以需要对每个单独的元素自定义图片路径.然后想到Less语法有mixin机制,就这样实现了一个递归function,然 ...

  5. [工作问题总结]MyEclipse 打开项目

    ------------------------------ASP.Net+Android+IO开发 .Net培训 期待与您交流!------------------------------ 1.项目 ...

  6. Linux内核:sk_buff解析

    sk_buff 目录 1 sk_buff介绍 2 sk_buff组成 3 struct sk_buff 结构体 4 sk_buff成员变量 4.1 Layout布局 4.2 General通用 4.3 ...

  7. WebApplication和WebSite的区别

    不同点 1. 创建方式不同 一个是FILE->NEW->PROJECT->ASP.NET WEB APPLICATION 另外一个是 FILE->NEW->WEBSITE ...

  8. js 随手记

    var name = 'frog' function hello(){ alert(name); // undefined var name = 'bbc'; } 在javascript中,函数是可以 ...

  9. AngularJS Directive - 开场小介绍(转)

    Directive其实就是让html变得更强大的一种方法.它可以根据需求对dom变形,或注入行为. 觉得它很神秘么,其实一点儿也不神秘,只要开始使用AngularJS了,就一定在使用着Directiv ...

  10. 原生Javascript实现图片轮播效果

    首先引入js运动框架 function getStyle(obj,name){ if(obj.currentStyle){ return obj.currentStyle[name]; } else{ ...