日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

ifndef详解

發(fā)布時(shí)間:2025/4/5 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ifndef详解 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

ifndef詳解

#ifndef 是"if not defined"的簡(jiǎn)寫(xiě),是預(yù)處理功能(宏定義、文件包含、條件編譯)當(dāng)中的條件編譯,可以根據(jù)是否已經(jīng)定義了一個(gè)變量來(lái)進(jìn)行分支選擇,其作用是:

  • 防止頭文件的重復(fù)包含和編譯;
  • 便于程序的調(diào)試和移植;
  • 下面分別舉例描述。

    一、防止頭文件的重復(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é)

    以上是生活随笔為你收集整理的ifndef详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。