淺談#ifndef,#define,#endif的作用和用法
問(wèn)題:ifndef/define/endif”主要目的是防止頭文件的重復(fù)包含和編譯
========================================================
用法:
.h文件,如下:
#ifndef XX_H
#define XX_H
...
#endif
這樣如果有兩個(gè)地方都包含這個(gè)頭文件,就不會(huì)出現(xiàn)兩次包含的情況 。。
因?yàn)樵诘诙伟瑫r(shí) XX_H 已經(jīng)有定義了,所以就不再 include了
-------------------------------------------------------
#ifndef GRAPHICS_H // 防止graphics.h被重復(fù)引用
#define GRAPHICS_H
#include <math.h> // 引用標(biāo)準(zhǔn)庫(kù)的頭文件
…
#include “myheader.h” // 引用非標(biāo)準(zhǔn)庫(kù)的頭文件
…
void Function1(…); // 全局函數(shù)聲明
…
class Box // 類結(jié)構(gòu)聲明
{
…
};
#endif
-----------------------------------------------------
那是指你建立多個(gè)文件時(shí),多個(gè)文件里都包含這個(gè)頭文件
-----------------------------------------------------
給你舉個(gè)例子,再順便分析一下:
假設(shè)你的工程里面有4個(gè)文件,分別是a.cpp,b.h,c.h,d.h
a.cpp的頭部是:
#include "b.h "
#include "c.h "
b.h和c.h的頭部都是:
#include "d.h "
而d.h里面有class D的定義。
這樣一來(lái),
編譯器編譯a.cpp的時(shí)候,先根據(jù)#include "b.h "去編譯b.h這個(gè)問(wèn)題,再根據(jù)b.h里面的#include "d.h ",去編譯d.h的這個(gè)文件,這樣就把d.h里面的class D編譯了;
然后再根據(jù)a.cpp的第二句#include "c.h ",去編譯c.h,最終還是會(huì)找到的d.h里面的class D,但是class D之前已經(jīng)編譯過(guò)了,所以就會(huì)報(bào)重定義錯(cuò)誤。
加上ifndef/define/endif,就可以防止這種重定義錯(cuò)誤。
--------------------------------------------------
-------------------------------------------------
1.比如你有兩個(gè)C文件,這兩個(gè)C文件都include了同一個(gè)頭文件。而編譯時(shí),這兩個(gè)C文件要一同編譯成一個(gè)可運(yùn)行文件,于是問(wèn)題來(lái)了,大量的聲明沖突。 還是把頭文件的內(nèi)容都放在#ifndef和#endif中吧。
不管你的頭文件會(huì)不會(huì)被多個(gè)文件引用,你都要加上這個(gè)。
一般格式是這樣的:
#ifndef <標(biāo)識(shí)>
#define <標(biāo)識(shí)>
......
......
#endif <標(biāo)識(shí)>
在理論上來(lái)說(shuō)可以是自由命名的,但每個(gè)頭文件的這個(gè)“標(biāo)識(shí)”都應(yīng)該是唯一的。標(biāo)識(shí)的命名規(guī)則一般是頭文件名全大寫,前后加下劃線,并把文件名中的“.”也變成下劃線,如:stdio.h
#ifndef _STDIO_H_ #define _STDIO_H_ ...... #endif
2.在#ifndef中定義變量出現(xiàn)的問(wèn)題(一般不定義在#ifndef中)。
#ifndef AAA
#define AAA
...
int i;
...
#endif
里面有一個(gè)變量定義在vc中鏈接時(shí)就出現(xiàn)了i重復(fù)定義的錯(cuò)誤,而在c中成功編譯。
原因:
(1).當(dāng)你第一個(gè)使用這個(gè)頭的.cpp文件生成.obj的時(shí)候,int i 在里面定義了當(dāng)另外一個(gè)使用這個(gè)的.cpp再次[單獨(dú)]生成.obj的時(shí)候,int i 又被定義然后兩個(gè)obj被另外一個(gè).cpp也include 這個(gè)頭的,連接在一起,就會(huì)出現(xiàn)重復(fù)定義.
(2).把源程序文件擴(kuò)展名改成.c后,VC按照C語(yǔ)言的語(yǔ)法對(duì)源程序進(jìn)行編譯,而不是C++。在C語(yǔ)言中,若是遇到多個(gè)int i,則自動(dòng)認(rèn)為其中一個(gè)是定義,其他的是聲明。
(3).C語(yǔ)言和C++語(yǔ)言連接結(jié)果不同,可能(猜測(cè))在進(jìn)行編譯的時(shí)候,C++語(yǔ)言將全局變量默認(rèn)為強(qiáng)符號(hào),所以連接出錯(cuò)。C語(yǔ)言則依照是否初始化進(jìn)行強(qiáng)弱的判斷的。
參考解決方法:
(1).把源程序文件擴(kuò)展名改成.c。
(2).推薦解決方案: .h中只聲明 extern int i;
在.cpp中定義
#ifndef __X_H__
#define __X_H__
extern int i;
#endif //__X_H__ int i;
注意問(wèn)題:變量一般不要定義在.h文件中。
以上就是小編為大家?guī)?lái)的淺談#ifndef,#define,#endif的作用和用法全部?jī)?nèi)容了,希望大家多多支持我們~
上一篇:C++對(duì)象內(nèi)存分布詳解(包括字節(jié)對(duì)齊和虛函數(shù)表)
欄 目:C語(yǔ)言
下一篇:淺談C++ 類的實(shí)例中 內(nèi)存分配詳解
本文標(biāo)題:淺談#ifndef,#define,#endif的作用和用法
本文地址:http://www.jygsgssxh.com/a1/Cyuyan/1884.html
您可能感興趣的文章
- 01-10淺談C/C++中的static與extern關(guān)鍵字的使用詳解
- 01-10淺談內(nèi)聯(lián)函數(shù)與宏定義的區(qū)別詳解
- 01-10淺談C++中的string 類型占幾個(gè)字節(jié)
- 01-10C語(yǔ)言中的內(nèi)聯(lián)函數(shù)(inline)與宏定義(#define)詳細(xì)解析
- 01-10typedef和#define的用法以及區(qū)別
- 01-10淺談關(guān)于指針作為參數(shù)并改變它的值的問(wèn)題
- 01-10C++類中的常量介紹
- 01-10淺談C#互操作的內(nèi)存溢出問(wèn)題
- 01-10淺談C語(yǔ)言中的強(qiáng)符號(hào)、弱符號(hào)、強(qiáng)引用和弱引用
- 01-10淺談MFC 改變控件大小和位置


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹(shù)的示例代碼(圣誕
- 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問(wèn)題方法
- 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語(yǔ)言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 04-02c語(yǔ)言函數(shù)調(diào)用后清空內(nèi)存 c語(yǔ)言調(diào)用
- 04-02func函數(shù)+在C語(yǔ)言 func函數(shù)在c語(yǔ)言中
- 04-02c語(yǔ)言的正則匹配函數(shù) c語(yǔ)言正則表達(dá)
- 04-02c語(yǔ)言用函數(shù)寫分段 用c語(yǔ)言表示分段
- 04-02c語(yǔ)言中對(duì)數(shù)函數(shù)的表達(dá)式 c語(yǔ)言中對(duì)
- 04-02c語(yǔ)言編寫函數(shù)冒泡排序 c語(yǔ)言冒泡排
- 04-02c語(yǔ)言沒(méi)有round函數(shù) round c語(yǔ)言
- 04-02c語(yǔ)言分段函數(shù)怎么求 用c語(yǔ)言求分段
- 04-02C語(yǔ)言中怎么打出三角函數(shù) c語(yǔ)言中怎
- 04-02c語(yǔ)言調(diào)用函數(shù)求fibo C語(yǔ)言調(diào)用函數(shù)求
隨機(jī)閱讀
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 01-11Mac OSX 打開(kāi)原生自帶讀寫NTFS功能(圖文
- 01-10C#中split用法實(shí)例總結(jié)
- 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
- 01-10delphi制作wav文件的方法
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 01-10SublimeText編譯C開(kāi)發(fā)環(huán)境設(shè)置
- 04-02jquery與jsp,用jquery
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?


