(转)#ifndef的用法
原文鏈接:http://wenku.baidu.com/link?url=c4doqVo3U429RkwTN5eaJIfD2rEu-1bLKKQXuqO8drmL359PhUjVmzC7P94wBY90bqYjPBRiuujahij4AM_06OkiOThB3v91fXexqpIukG_
定義?
#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常量進行調試,但是不能對宏常量進行調試。?
? ? ? ? 在C++?程序中只使用const常量而不使用宏常量,即const常量完全取代宏常量。
轉載于:https://www.cnblogs.com/zywscq/p/4957408.html
總結
以上是生活随笔為你收集整理的(转)#ifndef的用法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: GIS-013-Cesium Terra
- 下一篇: 天冷了思绪也飞远了