關于#ifndef,#define,#end的說明

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

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

 

single.h:

 1 #include <iostream>
 2 using namespace std;
 3 
 4 class A
 5 {
 6 public:
 7     A()
 8     {
 9         cout<<"Single header Define"<<endl;
10     }
11 };

singlenew.h

 1 #include <iostream>
 2 using namespace std;
 3 
 4 class A
 5 {
 6 public:
 7     A()
 8     {
 9         cout<<"SingleNew_h header Define"<<endl;
10     }
11 };

 

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

main.cpp:

 1 #include "single.h"
 2 #include "singlenew.h"
 3 #include <iostream>
 4 using namespace std;
 5 
 6 
 7 int main()
 8 {
 9     A a;
10     return 0;
11 }

 

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

關于#ifndef,#define,#end的說明

意思是类A重定义了。

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

 

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

single.h

 1 #ifndef _CLASS_A
 2 #define _CLASS_A
 3 #include <iostream>
 4 using namespace std;
 5 
 6 class A
 7 {
 8 public:
 9     A()
10     {
11         cout<<"Single header Define"<<endl;
12     }
13 };
14 #endif

singlenew.h

 1 #ifndef _CLASS_A
 2 #define _CLASS_A
 3 #include <iostream>
 4 using namespace std;
 5 
 6 class A
 7 {
 8 public:
 9     A()
10     {
11         cout<<"SingleNew_h header Define"<<endl;
12     }
13 };
14 #endif

 

 

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

關于#ifndef,#define,#end的說明

 

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

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

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

 

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

關于#ifndef,#define,#end的說明

 

这下对了吧。

 

 

 

 

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

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

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

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

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

 

更多相关文章
  • 一.简单的用ApplicationContext做测试的话,获得Spring中定义的Bean实例(对象).可以用: ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml" ...
  • VS2010+Opencv+SIFT以及出現的問題關于代碼sift_3_c的說明
    http://blog.sina.com.cn/s/blog_a6b913e30101dv
  • 在经过的几天挣扎后,觉得我们现在做的项目:四则运算嵌入APP的发展空间太小和当前我们所处的环境不符合,产品实际意义不大,用户较难以找到,所以小组决定更改我们的项目,我们决定做:广商博客. 我们已经有了构想,接下来将会
  • JavaFX結合 JDBC, Servlet, Swing, Google Map及動態產生比例圖 (2):JavaFX建立及程式碼說明 (轉帖)
    說明:就如同標題一樣,前端會用到JavaFX.Swing.Java Web Start.Google Map 的技術, 後端就是JDBC.Servlet的技術,以及我們會簽署認證jar檔案,這樣才可存取客戶端(ex:執行命令,存檔等等), 以這樣的架構其實很容易就可以讓我們開發各式各樣的系統,當然你 ...
  • DP-301U 搭配HP LasterJet 1020 雷射印表機設定說明 1.安裝PSM 工具程式. 1.1 執行"PSMSetup.exe". 1.2 請選擇安裝語言(預設為中文) 1.3 請按下"下一步"按鈕. 1.4若不選擇其他安裝目的地的話,請按下& ...
  • 翻譯這篇文章源於我的一個通用工資計算平台的想法,在工資的計算中,不可避免的需要使用到自定義公式,然而對於自定義公式的實現,我自己想了一些,也在網上搜索了很多,解決辦法大致有以下幾種: 1. 自己寫代碼去解析公式.這種方法的缺點是,解析的代碼很難實現,如果公式的功能比較完整,如增加條件判斷或自定義函數
  • 


    		    架構設計_案例說明_by 高老師
    ee ee 欢迎访问 ==>高老师的博客网页 高焕堂:MISOO(大数据.大思考)联盟.台北中心和东京(日本)分社.总教练 EE EE 架構設計 案例說明: ----------1. 智能家庭的软硬整合<A段架构设计>_案例解说 ----------2.<家庭物联网>与 ...
  • 快速設定技巧 接下來進行快速設定程序,共有兩個途徑可以設定IMail Anti-Virus ,其一為IMail管理介面,其二為IMailWEB管理介面.經由Anti-Virus 的設定選項,我們可以達成以下目的: ◎ 啟動或停止 Anti-Virus防毒功能. ◎ 替Anti-Virus伺服器設定I
一周排行