#ifndef#define#endif用法

#ifndef

目錄
定義
補充一些內容
詳細討論#ifndef的作用
條件編譯的命令的三種形式
編輯本段
定義
  #ifndef x
  #define x
  ...
  #endif
  這是宏定義的一種,它可以根據是否已經定義了一個變量來進行分支選擇,一般用於調試等等.實際上確切的說這應該是預處理功能中三種(宏定義,文件包含和條件編譯)中的一種----條件編譯。 C語言在對程序進行編譯時,會先根據預處理命令進行“預處理”。C語言編譯系統包括預處理,編譯和鏈接等部分。
      #ifndef x //先測試x是否被宏定義過
  #define x
  程序段1 //如果x沒有被宏定義過,定義x,並編譯程序段1
  #endif
  程序段2 //如果x已經定義過了則編譯程序段2的語句,“忽視”程序段1。

  條件指示符#ifndef 的最主要目的是防止頭文件的重複包含和編譯瞭解:條件編譯當然也可以用條件語句來實現。 但是用條件語句將會對整個源程序進行編譯,生成的目標代碼程序很長,而採用條件編譯,則根據條件只編譯其中的程序段1或程序段2,生成的目標程序較短。如果條件選擇的程序段很長,採用條件編譯的方法是十分必要的。
編輯本段
補充一些內容
  千萬不要忽略了頭文件中的#ifndef,這是一個很關鍵的東西。比如你有兩個C文件,這兩個C文件都include了同一個頭文件。而編譯時,這兩個C文件要一同編譯成一個可運行文件,於是問題來了,大量的聲明衝突。
  還是把頭文件的內容都放在#ifndef和#endif中吧。不管你的頭文件會不會被多個文件引用,你都要加上這個。一般格式是這樣的:
  #ifndef <標識>
  #define <標識>
  ......
  ......
  #endif
  <標識>在理論上來說可以是自由命名的,但每個頭文件的這個“標識”都應該是唯一的。標識的命名規則一般是頭文件名全大寫,前後加下劃線,並把文件名中的“.”也變成下劃線,如:stdio.h
  #ifndef _STDIO_H_
  #define _STDIO_H_
  ......
  #endif
編輯本段
詳細討論#ifndef的作用
  在c語言中,對同一個變量或者函數進行多次聲明是不會報錯的。所以如果h文件裏只是進行了聲明工作,即使不使用# ifndef宏定義,多個c文件包含同一個h文件也不會報錯。
  但是在c++語言中,#ifndef的作用域只是在單個文件中。所以如果h文件裏定義了全局變量,即使採用#ifndef宏定義,多個c文件包含同一個h文件還是會出現全局變量重定義的錯誤。
  使用#ifndef可以避免下面這種錯誤:如果在h文件中定義了全局變量,一個c文件包含同一個h文件多次,如果不加#ifndef宏定義,會出現變量重複定義的錯誤;如果加了#ifndef,則不會出現這種錯誤。
編輯本段
條件編譯的命令的三種形式
  “ 條件編譯”命令允許對程序中的內容選擇性地編譯。即可以根據一定的條件選擇是否編譯。
  條件編譯的命令主要有以下幾種
  形式1
  # i f d e f標識符
  程序段 I
  # el s e
  程序段 2
  # en di f
  它的作用是當 “ 標識符”已經由# d e f i n e定義過了。則編譯“ 程序段 1 ” 。 否則編譯“ 程序段 2 ” 。其中如果不需要編譯“ 程序段 2 ”。則上述形式可以變換 爲:
  # i f d e f標識符
  程序段 1
  # en di f
  形式2
  # i f n d e f標識符
  程序段 1
  # el s e
  程序段 2
  #e n di f
  它的作用是當 “ 標識符 沒有由# d e f i n e定義過。 則編譯“程序段 1”。否則編譯“程序段 2” 。同樣當無“ 程序段2 ”時。則上述形式變換爲:
  # i f n d e f標識符
  程序段 1
  #e n di f
  形式3
  # if表達式
  程序段 1
  #el s e e
  程序段 2
  #endif
  它的作用是 當“表達式”值爲真時。編譯程序段1。否則則編譯程序段
  2。同樣 當無程序段 2時,則上述形式變換 爲 :
  # 表達式
  程序段 1
  #e n di f
  以上三種形式的條件編譯預處理
  結構都可以嵌套使用。 當# e l s e後嵌套 # i f 時,可以使用預處理命令 # e l i f , 它相

  當於 # e l s e# i f 。在程序中使用條件編譯主要是爲了方便程序的調試和移植。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章