#ifndef的用法


作用:防止頭文件的重復包含和編譯

 

定義

  #ifndef x

  #define x

  ...

  #endif

  這是宏定義的一種,它可以根據是否已經定義了一個變量來進行分支選擇,一般用於調試等等.實際上確切的說這應該是預處理功能中三種(宏定義,文件包含和條件編譯)中的一種----條件編譯。 C語言在對程序進行編譯時,會先根據預處理命令進行“預處理”。C語言編譯系統包括預處理,編譯和鏈接等部分。

  #ifndef x

  //先測試x是否被宏定義過

  #define x

  //如果沒有宏定義下面就宏定義x並編譯下面的語句

  ...

  #endif

  //如果已經定義了則編譯#endif后面的語句

  條件指示符#ifndef檢查預編譯常量在前面是否已經被宏定義。如果在前面沒有被宏定義,則條件指示符的值為真,於是從#ifndef到#endif之間的所有語句都被包含進來進行編譯處理。相反,如果#ifndef指示符的值為假,則它與#endif指示符之間的行將被忽略。條件指示符#ifndef 的最主要目的是防止頭文件的重復包含和編譯。

補充一些內容

  千萬不要忽略了頭件的中的#ifndef,這是一個很關鍵的東西。比如你有兩個C文件,這兩個C文件都include了同一個頭文件。而編譯時,這兩個C文件要一同編譯成一個可運行文件,於是問題來了,大量的聲明沖突。

  還是把頭文件的內容都放在#ifndef和#endif中吧。不管你的頭文件會不會被多個文件引用,你都要加上這個。一般格式是這樣的:

  #ifndef <標識>

  #define <標識>

  ......

  #endif

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

  #ifndef _STDIO_H_

  #define _STDIO_H_

  ......

#endif

#ifndef xxx//如果沒有定義xxx
#define xxx//定義xxx
#endif //結束如果
這個用法主要是在頭文件中,主要是為了防止類重復的include,所以在類的頭文件之前加上前面兩個,用類名替代xxx,在最后加上最后一句。
const 與 #define的比較
    C++ 語言可以用const來定義常量,也可以用 #define來定義常量。但是前者比后者有更多的優點:
(1)       const常量有數據類型,而宏常量沒有數據類型。編譯器可以對前者進行類型安全檢查。而對后者只進行字符替換,沒有類型安全檢查,並且在字符替換可能會產生意料不到的錯誤(邊際效應)。
 
(2)       有些集成化的調試工具可以對const常量進行調試,但是不能對宏常量進行調試。
        【規則5-2-1】在C++ 程序中只使用const常量而不使用宏常量,即const常量完全取代宏常量。

拓展閱讀百度百科


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM