关于#ifndef,#define,#end的说明
#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的说明的更多相关文章
- C/C++头文件使用 #ifndef #define #endif 的原因
背景 在编译的时候,出现"redefine"的错误,最后检查才发现对应的头文件没有写正确的预编译信息: #ifndef _HeadFileName_H #define _HeadF ...
- 头文件里面的ifndef /define/endif的作用
c,c++里面,头文件里面的ifndef /define/endif的作用 今天和宿舍同学讨论一个小程序,发现有点地方不大懂······ 是关于头文件里面的一些地方: 例如:要编写头文件test.h ...
- 转 #ifndef/#define/#endif使用详解
想必很多人都看过“头文件中的 #ifndef/#define/#endif 防止该头文件被重复引用”.但是是否能理解“被重复引用”是什么意思?是不能在不同的两个文件中使用include来包含这个头文件 ...
- C++头文件为什么要加#ifndef #define #endif
#ifndef 在头文件中的作用 在一个大的软件工程里面,可能会有多个文件同时包含一个头文件,当这些文件编译链接成一个可执行文件时 ,就会出现大量“重定义”的错误.在头文件中实用#ifndef #de ...
- 头文件为什么要加#ifndef #define #endif
#ifndef 在头文件中的作用 在一个大的软件工程里面,可能会有多个文件同时包含一个头文件,当这些文件编译链接成一个可执行文件时 ,就会出现大量“重定义”的错误.在头文件中实用#ifndef #de ...
- 头文件中的#ifndef/#define/#endif 的作用
在一个大的软件工程里面,可能会有多个文件同时包含一个头文件,当这些文件编译链接成一个可执行文件时,就会出现大量重定义的错误.在头文件中实用#ifndef #define #endif能避免头文件的重定 ...
- ifndef/define/endif作用和用法
问题:ifndef/define/endif”主要目的是防止头文件的重复包含和编译,偶只知道这个概念不懂的是怎么个用法,和为什么要用它~~高手请指点一下~~谢谢~~~!!! ------------- ...
- #ifndef#define#endif的用法
在网上看到了感觉作者总结得很好,作者辛苦了! #ifndef#define#endif的用法 文件中的#ifndef 头件的中的#ifndef,这是一个很关键的东西.比如你有两个C文件,这两个C文件都 ...
- #ifndef #define #endif 防止头文件被重复引用
想必很多人都看过“头文件中的 #ifndef/#define/#endif 防止该头文件被重复引用”.但是是否能理解“被重复引用”是什么意思?是不能在不同的两个文件中使用include来包含这个头文件 ...
随机推荐
- IO-APIC
MP-BIOS bug :8254 timer not connected to IO-APIC解决办法 云计算中在基于一个template image instance vmServer时出现上述的 ...
- 最简单的XML转数组
/** * 最简单的XML转数组 * @param string $xmlstring XML字符串 * @return array XML数组 */ function simplest_xml_to ...
- [转]轻量级 Java Web 框架架构设计
工作闲暇之余,我想设计并开发一款轻量级 Java Web 框架,看看能否取代目前最为流行的而又越来越重的 Spring.Hibernate 等框架.请原谅在下的大胆行为与不自量力,本人不是为了重造轮子 ...
- github使用-知乎的某小姐的一篇文章
作者:珊姗是个小太阳链接:http://www.zhihu.com/question/20070065/answer/79557687来源:知乎著作权归作者所有,转载请联系作者获得授权. 作为一个文科 ...
- jquery 底部导航透明度变化
如果滚动条到达底部,footer-nav 的透明度为1,否则为0.8: html <div class="footer-nav" id="footer"& ...
- 自适应SimpsonSimpson积分
- NFinal学习笔记 02—NFinalBuild
在学习NFinal的过程中发现在线.net编译器Web版—— NFinalBuild 什么是NFinalBuild呢?它就是帮助我们简单又快速的更新我们网站的一种编译器,我们不用再只为了更新.net网 ...
- 自己对WSO2 ESB 见解
这周没想到要更新什么内容,就把我最近工作接触的WSO2 ESB简单介绍下吧. 前提: 一切文档,知识都要与官方文档为准. WSO2 ESB: http://wso2.com/products/ ...
- POJ 1556 - The Doors 线段相交不含端点
POJ 1556 - The Doors题意: 在 10x10 的空间里有很多垂直的墙,不能穿墙,问你从(0,5) 到 (10,5)的最短距离是多少. 分析: 要么直达,要么 ...
- (原+译)LUA调用C函数
转载请注明出处: http://www.cnblogs.com/darkknightzh/p/5804924.html 原始网址: http://www.troubleshooters.com/cod ...