最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深入淺析C/C++?的條件編譯

 更新時(shí)間:2022年04月24日 10:21:06   作者:五毛變向.  
條件編譯是指預(yù)處理的時(shí)候根據(jù)條件編譯的指令有條件的選擇源程序中的一部分代碼送給編譯器進(jìn)行編譯,進(jìn)行有選擇性的操作,防止宏替換的內(nèi)容重復(fù)包含,這篇文章主要介紹了C/C++?的條件編譯,需要的朋友可以參考下

1.條件編譯的時(shí)機(jī)

我們都知道vscode其實(shí)是一個(gè)編輯器,你要在上面跑C或者C++你需要配置編譯器,拿編譯器是怎樣吧一個(gè)文本文件變成一個(gè)可執(zhí)行文件的呢?

那必然是經(jīng)歷以下這四步

  • 處理:宏替換,頭文件的展開,去注釋,條件編譯
  • 編譯:將預(yù)處理后的源文件轉(zhuǎn)換為匯編語言文件,只編譯源文件,不編譯頭文件,頭文件在剛剛預(yù)處理階段已經(jīng)展開。
  • 匯編:雖然叫做匯編,但是不是轉(zhuǎn)變?yōu)閰R編代碼,而是將剛剛的匯編語言文件轉(zhuǎn)換為機(jī)器碼,也就是二進(jìn)制文件。
  • 鏈接:將生成的二進(jìn)制代碼與庫函數(shù)以及其他目標(biāo)文件,通過鏈接器鏈接起來形成可執(zhí)行文件的過程。

分析了以上過程由此可以很清晰的得出這個(gè)結(jié)論,條件編譯是在預(yù)處理的時(shí)候發(fā)生的。

2.條件編譯的作用

條件編譯是指預(yù)處理的時(shí)候根據(jù)條件編譯的指令有條件的選擇源程序中的一部分代碼送給編譯器進(jìn)行編譯,進(jìn)行有選擇性的操作,防止宏替換的內(nèi)容重復(fù)包含。

常見的條件編譯指令如下:

常見條件編譯指令

3.#if #else #endif

#if 表達(dá)式
 
// code
#else
#endif

如果表達(dá)式為真則#if后程序段被調(diào)用

明顯發(fā)現(xiàn)第一段的色段跟第二段的色段都不一樣!肯定是第一句輸出了!

可以看到他直接call調(diào)用的就是標(biāo)準(zhǔn)命名空間下的operator類里面的函數(shù),其實(shí)也就是 << 輸出

4.#ifndef #define #endif

#ifdef 標(biāo)識符
#define 標(biāo)識符 替換列表
 
// code
#endef
  • 一般用于檢測程序中是否已經(jīng)定義了名字為某標(biāo)識符的宏,如果沒有定義該宏,則定義該宏,并選中從 #define 開始到 #endif 之間的程序段;
  • 如果已定義,則不再重復(fù)定義該符號,且相應(yīng)程序段不被選中。

我們都知道NULL在C中是一個(gè)宏,宏有時(shí)也會(huì)引起不必要的問題在C++11中則有了nullptr,所以這塊顯示是已經(jīng)被宏過了,所有不執(zhí)行#define 到#endef的程序段所以看起來是灰色的。

紅色框框是每個(gè)函數(shù)都有的,就是主函數(shù)棧幀開辟和銷毀的過程,再看中間好家伙啥都沒有,再次印證了,我們說的如果沒有定義該宏,則定義該宏,并選中從 #define 開始到 #endif 之間的程序段;如果已定義,則不再重復(fù)定義該符號,且相應(yīng)程序段不被選中。

該條件編譯指令更重要的一個(gè)應(yīng)用是防止頭文件重復(fù)包含。

如果 f.c 源文件中包含 f1.h 和 f2.h 兩個(gè)頭文件,而 f1.h 頭文件及 f2.h 頭文件中均包含 f3.h 頭文件,則 f.c 源文件因?yàn)榘?f1.h 和 f2.h 兩個(gè)頭文件,所以中重復(fù)包含 f3.h 頭文件??刹捎脳l件編譯指令,來避免頭文件的重復(fù)包含問題。

#ifndef _HEADNAME_H_
#define _HEADNAME_H_
    //頭文件內(nèi)容
#endif
  • 當(dāng)該頭文件第一次被包含時(shí),由于沒檢測到該頭文件名對應(yīng)的宏名,則定義該頭文件名對應(yīng)的宏,其值為該系統(tǒng)默認(rèn)。并且,該條件編譯指令選中 #endif 之前的頭文件內(nèi)容;
  • 如果該頭文件再次被包含時(shí),由于檢測到已存在以該頭文件名對應(yīng)的宏名,則忽略該條件編譯指令之間的所有代碼,從而避免了重復(fù)包含。

5.#if #elif #else #endif

#if 條件表達(dá)式1
 
    // code1
#elif 條件表達(dá)式2
    //code 2
#else
        
    //code 3
#endif
  • 功能為:先判斷條件1的值,如果為真,則程序段 1 被選中編譯;
  • 如果為假,而條件表達(dá)式 2 的值為真,則程序段 2 被選中編譯;
  • 其他情況,程序段 3 被選中編譯。

6.#ifdef #endif

#ifdef 標(biāo)識符
    //code
#endif
  • 如果檢測到已定義該標(biāo)識符,則選擇執(zhí)行相應(yīng)程序段被選中編譯;
  • 否則,該程序段會(huì)被忽略。
#include <iostream>
using namespace std;
#define PI 3.14
int main() {
#ifdef PI 
#undef PI
	cout << "PI 已經(jīng)被取消宏" << endl;
#endif 
}

如果檢測到符號 PI已定義,則刪除其定義,并選中相應(yīng)的程序段。

到此這篇關(guān)于深入淺析C/C++ 的條件編譯的文章就介紹到這了,更多相關(guān)c++條件編譯內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • C++實(shí)現(xiàn)棧的操作(push和pop)

    C++實(shí)現(xiàn)棧的操作(push和pop)

    這篇文章主要介紹了C++實(shí)現(xiàn)棧的操作(push和pop),具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • C++?Queue隊(duì)列類模版實(shí)例詳解

    C++?Queue隊(duì)列類模版實(shí)例詳解

    這篇文章主要為大家詳細(xì)介紹C++?Queue隊(duì)列類模版實(shí)例,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • c++11新特性多線程操作實(shí)戰(zhàn)

    c++11新特性多線程操作實(shí)戰(zhàn)

    這篇文章主要介紹了c++11新特性多線程操作實(shí)戰(zhàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • C語言數(shù)據(jù)結(jié)構(gòu)之模式匹配字符串定位問題

    C語言數(shù)據(jù)結(jié)構(gòu)之模式匹配字符串定位問題

    這篇文章主要介紹了C語言數(shù)據(jù)結(jié)構(gòu)之模式匹配字符串定位問題的相關(guān)資料,希望通過本文能幫助到大家,讓大家理解這部分內(nèi)容,需要的朋友可以參考下
    2017-10-10
  • 淺談C++繼承中的名字查找

    淺談C++繼承中的名字查找

    下面小編就為大家?guī)硪黄獪\談C++繼承中的名字查找。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-01-01
  • 利用C語言實(shí)現(xiàn)三子棋(井字棋)小游戲

    利用C語言實(shí)現(xiàn)三子棋(井字棋)小游戲

    這篇文章主要為大家詳細(xì)介紹了利用C語言實(shí)現(xiàn)三子棋小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • C++解析特殊符號tab和換行符號詳情

    C++解析特殊符號tab和換行符號詳情

    這篇文章主要給大家介紹的是C++解析一些特殊符號tab、換行符號的一些相關(guān)資料,需要的小伙伴可以參考下面文章的具體內(nèi)容
    2021-09-09
  • C++函數(shù)返回值為對象時(shí),構(gòu)造析構(gòu)函數(shù)的執(zhí)行細(xì)節(jié)

    C++函數(shù)返回值為對象時(shí),構(gòu)造析構(gòu)函數(shù)的執(zhí)行細(xì)節(jié)

    C++函數(shù)返回值為對象時(shí),構(gòu)造析構(gòu)函數(shù)的執(zhí)行細(xì)節(jié),需要的朋友,可以參考下
    2013-02-02
  • 基于atoi()與itoa()函數(shù)的內(nèi)部實(shí)現(xiàn)方法詳解

    基于atoi()與itoa()函數(shù)的內(nèi)部實(shí)現(xiàn)方法詳解

    本篇文章是對atoi()與itoa()函數(shù)的內(nèi)部實(shí)現(xiàn)方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • 最新評論

    明溪县| 泸水县| 阿瓦提县| 塘沽区| 昌邑市| 广丰县| 茂名市| 泉州市| 林周县| 应城市| 锡林浩特市| 遂溪县| 新昌县| 靖边县| 乐平市| 新巴尔虎左旗| 壤塘县| 东阿县| 女性| 城口县| 汾阳市| 大关县| 昔阳县| 白水县| 体育| 桃园县| 阿拉善右旗| 吐鲁番市| 肥西县| 禄劝| 株洲县| 兴仁县| 时尚| 抚顺县| 稻城县| 阜平县| 绍兴县| 台州市| 双牌县| 义马市| 淮阳县|