ifndef详解
ifndef詳解
#ifndef 是"if not defined"的簡(jiǎn)寫(xiě),是預(yù)處理功能(宏定義、文件包含、條件編譯)當(dāng)中的條件編譯,可以根據(jù)是否已經(jīng)定義了一個(gè)變量來(lái)進(jìn)行分支選擇,其作用是:
下面分別舉例描述。
一、防止頭文件的重復(fù)包含和編譯
下面是錯(cuò)誤示范:
headfile_1.h
1 #include <iostream>2 class CTest_1 {3 CTest_1() {4 //do something,eg:init;5 }6 ~CTest_1() {7 //do something ,eg:free;8 }9 void PrintScreen() 10 { 11 std::cout << "this is Class CTest_1!" << std::endl; 12 } 13 };headfile_2.h
1 #include "headfile_1.h"2 class CTest_2 {3 CTest_2() {4 //do something,eg:init;5 }6 ~CTest_2() {7 //do something,eg:free;8 }9 void PrintScreen() 10 { 11 std::cout << "this is Class CTest_2!" << std::endl; 12 } 13 };sourcefile.cpp
1 #include <iostream> 2 #include "headfile_1.h" 3 #include "headfile_2.h" 4 5 int main() 6 { 7 return 0; 8 }編譯時(shí)提示重定義錯(cuò)誤:
以上顯示headfile_1.h中的類(lèi)CTest_1重定義了。
一般地,假如有一個(gè)C源文件(如sourcefile.cpp),它包含兩個(gè)頭文件(如headfile_1.h和headfile_2.h),而頭文件headfile_2.h又包含了headfile_1.h,則最終的效果是該源文件包含了兩次headfile_1.h。如果你在頭文件里定義了結(jié)構(gòu)體或者類(lèi)類(lèi)型,那么問(wèn)題來(lái)了,編譯時(shí)將會(huì)報(bào)重復(fù)定義的錯(cuò)誤。
加上條件編譯"ifndef"則問(wèn)題可解決。在headfile_1.h中加上條件編譯,如下:
headfile_1.h
1 #ifndef _HEADFILE_1_H2 #define _HEADFILE_1_H3 #include <iostream>4 class CTest_1 {5 CTest_1() {6 //do something,eg:init;7 }8 ~CTest_1() {9 //do something ,eg:free; 10 } 11 void PrintScreen() 12 { 13 std::cout << "this is Class CTest_1!" << std::endl; 14 } 15 }; 16 17 #endif //end of _HEADFILE_1_H編譯通過(guò)!
分析:當(dāng)?shù)谝淮伟琱eadfile_1.h時(shí),由于沒(méi)有定義_HEADFILE_1_H,條件為真,這樣就會(huì)執(zhí)行#ifndef _HEADFILE_1_H和#endif之間的代碼;當(dāng)?shù)诙伟琱eadfile_1.h時(shí),前面一次已經(jīng)定義了_HEADFILE_1_H,條件為假,#ifndef _HEADFILE_1_H和#endif之間的代碼也就不會(huì)再次被包含,這樣就避免了重定義。
小結(jié):還是把頭文件的內(nèi)容都放在#ifndef和#endif中吧。不管你的頭文件會(huì)不會(huì)被多個(gè)文件引用,你最好都加上這個(gè)。一般格式是這樣的:
#ifndef <標(biāo)識(shí)> #define <標(biāo)識(shí)>............#endif<標(biāo)識(shí)>在理論上來(lái)說(shuō)是可以自由命名的,但每個(gè)頭文件的這個(gè)“標(biāo)識(shí)”都應(yīng)該是唯一的。標(biāo)識(shí)的明明規(guī)則一般是頭文件名全大寫(xiě),前面加下劃線,并把文件名中的"."也變成下劃線,如:stdio.h
#ifndef _STDIO_H #define _STDIO_H............#endif注意:#ifndef起到的效果是防止一個(gè)源文件多次包含同一個(gè)頭文件,而不是防止兩個(gè)源文件包含同一個(gè)頭文件。事實(shí)上,防止同一頭文件被兩個(gè)不同的源文件包含這種要求本身就是不合理的,頭文件存在的價(jià)值就是被不同的源文件包含。
二、便于程序的調(diào)試和移植
在調(diào)試程序時(shí),常常需要對(duì)程序中的內(nèi)容進(jìn)行選擇性地編譯,即可以根據(jù)一定的條件選擇是否編譯。
主要分以下幾種:
1、
#ifndef 標(biāo)識(shí)符程序段 1#else程序段 2#endif它的作用是當(dāng)“標(biāo)識(shí)符”沒(méi)有由#define定義過(guò),則編譯“程序段1”,否則編譯“程序段2”。
2、
#ifndef 標(biāo)識(shí)符#define 標(biāo)識(shí)符程序段 1#else程序段 2#endif它的作用是當(dāng)“標(biāo)識(shí)符”沒(méi)有由#define定義過(guò),則編譯“程序段1”,否則編譯“程序段2”。
3、
#if 表達(dá)式程序段 1#else程序段 2#endif它的作用是當(dāng)“表達(dá)式”值為真時(shí),編譯“程序段1”,否則編譯“程序段2”。
注:以上三種形式中#else不是強(qiáng)制的,可省略;當(dāng)然,當(dāng)#else后需要嵌套#if時(shí),可以使用預(yù)處理命令#elif,它相當(dāng)于#else#if。
小結(jié):在程序中使用條件編譯主要是為了方便程序的調(diào)試和移植。
轉(zhuǎn)載自:https://www.cnblogs.com/codingmengmeng/p/7221295.html
總結(jié)
- 上一篇: Linux中su 和 su -的区别
- 下一篇: 一些命名规则