ifndef/define/endif的區別

問題:ifndef/define/endif”主要目的是防止頭文件的重複包含和編譯

========================================================

用法:

.h文件,如下:
#ifndef XX_H
#define XX_H
...
#endif

這樣如果有兩個地方都包含這個頭文件,就不會出現兩次包含的情況 。。

因爲在第二次包含時 XX_H 已經有定義了,所以就不再 include了
-------------------------------------------------------

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#ifndef GRAPHICS_H // 防止graphics.h被重複引用
#define GRAPHICS_H
 
#include <math.h> // 引用標準庫的頭文件
#include “myheader.h” // 引用非標準庫的頭文件
void Function1(…); // 全局函數聲明
class Box // 類結構聲明
{
};
#endif

-----------------------------------------------------

那是指你建立多個文件時,多個文件裏都包含這個頭文件
-----------------------------------------------------

給你舉個例子,再順便分析一下:

假設你的工程裏面有4個文件,分別是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的定義。

這樣一來,

編譯器編譯a.cpp的時候,先根據#include "b.h "去編譯b.h這個問題,再根據b.h裏面的#include "d.h ",去編譯d.h的這個文件,這樣就把d.h裏面的class D編譯了;

然後再根據a.cpp的第二句#include "c.h ",去編譯c.h,最終還是會找到的d.h裏面的class D,但是class D之前已經編譯過了,所以就會報重定義錯誤。

加上ifndef/define/endif,就可以防止這種重定義錯誤。
--------------------------------------------------
-------------------------------------------------

1.比如你有兩個C文件,這兩個C文件都include了同一個頭文件。而編譯時,這兩個C文件要一同編譯成一個可運行文件,於是問題來了,大量的聲明衝突。 還是把頭文件的內容都放在#ifndef和#endif中吧。

不管你的頭文件會不會被多個文件引用,你都要加上這個。

一般格式是這樣的:

#ifndef <標識>
#define <標識>
......
......
#endif <標識>

在理論上來說可以是自由命名的,但每個頭文件的這個“標識”都應該是唯一的。標識的命名規則一般是頭文件名全大寫,前後加下劃線,並把文件名中的“.”也變成下劃線,如:stdio.h

?
1
2
3
4
#ifndef _STDIO_H_
#define _STDIO_H_
......
#endif

2.在#ifndef中定義變量出現的問題(一般不定義在#ifndef中)。

#ifndef AAA
#define AAA
...
int i;
...
#endif

裏面有一個變量定義在vc中鏈接時就出現了i重複定義的錯誤,而在c中成功編譯。

原因:

(1).當你第一個使用這個頭的.cpp文件生成.obj的時候,int i 在裏面定義了當另外一個使用這個的.cpp再次[單獨]生成.obj的時候,int i 又被定義然後兩個obj被另外一個.cpp也include 這個頭的,連接在一起,就會出現重複定義.

(2).把源程序文件擴展名改成.c後,VC按照C語言的語法對源程序進行編譯,而不是C++。在C語言中,若是遇到多個int i,則自動認爲其中一個是定義,其他的是聲明。

(3).C語言和C++語言連接結果不同,可能(猜測)在進行編譯的時候,C++語言將全局變量默認爲強符號,所以連接出錯。C語言則依照是否初始化進行強弱的判斷的。

參考解決方法:

(1).把源程序文件擴展名改成.c。

(2).推薦解決方案: .h中只聲明 extern int i;

在.cpp中定義

#ifndef __X_H__
#define __X_H__
extern int i;
#endif //__X_H__ int i;
注意問題:變量一般不要定義在.h文件中。

發佈了45 篇原創文章 · 獲贊 27 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章