程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 頭文件裡面的ifndef /define/endif的作用,ifndefendif

頭文件裡面的ifndef /define/endif的作用,ifndefendif

編輯:關於C語言

頭文件裡面的ifndef /define/endif的作用,ifndefendif


c,c++裡面,頭文件裡面的ifndef /define/endif的作用

今天和宿捨同學討論一個小程序,發現有點地方不大懂······

     是關於頭文件裡面的一些地方:

例如:要編寫頭文件test.h

         在頭文件開頭寫上兩行:

          #ifndef _TEST_H

          #define _TEST_H//一般是文件名的大寫

         ············

         ············

         頭文件結尾寫上一行:

          #endif

    大概是以前沒有學好吧,對這裡不是很理解,為什麼要用這些呢?剛才上網查了查,借鑒了點高手的,自己總結了一點,就寫在這裡了,有什麼錯誤之處,請大俠們指出

 

    1.比如你有兩個C文件,這兩個C文件都include了同一個頭文件。而編譯時,這兩個C文件要一同編譯成一個可運行文件,於是問題來了,大量的聲明沖突。

例如:

假設你的工程裡面有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,就可以防止這種重定義錯誤。

 

所以還是把頭文件的內容都放在#ifndef和#endif中吧。  
不管你的頭文件會不會被多個文件引用,你都要加上這個。  
一般格式是這樣的:   
#ifndef   <標識 >   
#define   <標識 >   
......   
......   
#endif   <標識 >  
在理論上來說可以是自由命名的,但每個頭文件的這個“標識”都應該是唯一的。標識的命名規則一般是頭文件名全大寫,前後加下劃線,並把文件名中的“.”也變成下劃線,如:stdio.h   
#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文件中。

推薦:http://www.cnblogs.com/roucheng/p/cfenge.html

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved