一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

預(yù)編譯的理解及作用原理

嵌入式應(yīng)用開發(fā) ? 來源:嵌入式應(yīng)用開發(fā) ? 作者:嵌入式應(yīng)用開發(fā) ? 2022-12-29 17:07 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

poYBAGOtWAqAR7InAAEgB0IqMEU843.png

三種預(yù)處理詳解
1、宏定義指令

宏定義了一個代表特定內(nèi)容的標(biāo)識符。預(yù)處理過程會把源代碼中出現(xiàn)的宏標(biāo)識符替換成宏定義時的值。
宏最常見的用法是定義代表某個值的全局符號;而第二種用法是定義帶參數(shù)的宏(宏函數(shù)),這樣的宏可以象函數(shù)一樣被調(diào)用,但它是在調(diào)用語句處展開宏,并用調(diào)用時的實際參數(shù)來代替定義中的形式參數(shù)。
#define指令:
#define預(yù)處理指令用來定義宏。該指令最簡單的格式是:聲明一個標(biāo)識符,給出這個標(biāo)識符代表的代碼(比如像圓周率這樣的數(shù))。在后面的源代碼中,我們就可以使用定義的宏取代要使用的代碼,代碼舉例:

#define PI 3.141592654

使用宏的好處有兩點:
一是使用方便。如下:

#define PI 3.1415926

PI顯然比3.1415926寫著方便。
二是定義的宏有了意義,可讀性強(qiáng)。如例1,MAX_NUM,望文生意便知是最大數(shù)量的意思,比單純使用10這個數(shù)字可讀性要強(qiáng)的多。
三是容易修改。如例1,如果在程序中有幾十次會使用到MAX_NUM,修改只需要在宏定義里面修改一次就可以,否則你會修改到崩潰。
2、條件編譯指令
程序員可以通過定義不同的宏來決定編譯程序?qū)δ男┐a進(jìn)行處理。條件編譯指令將決定哪些代碼被編譯,而哪些是不被編譯的??梢愿鶕?jù)表達(dá)式的值或者某個特定的宏是否被定義來確定編譯條件。
#if/#endif/#else/#elif指令:
#if指令檢測跟在制造另關(guān)鍵字后的常量表達(dá)式。如果表達(dá)式為真,則編譯后面的代碼,直到出現(xiàn)#else、#elif或#endif為止;否則就不編譯。
#endif用于終止#if預(yù)處理指令。
#else指令用于某個#if指令之后,當(dāng)前面的
#if指令的條件不為真時,就編譯
#else后面的代碼。
代碼舉例:

#define DEBUG       //此時#ifdef DEBUG為真
//#define DEBUG 0  //此時為假
int main()
{
  #ifdef DEBUG
     printf("Debuggingn");
  #else
     printf("Not debuggingn");
  #endif
  printf("Runningn");
  return 0;
}  

這樣我們就可以實現(xiàn)debug功能,每次要輸出調(diào)試信息前,只需要#ifdef DEBUG判斷一次。不需要了就在文件開始定義#define DEBUG 0
#elif預(yù)處理指令綜合了#else和#if指令的作用。

3、頭文件包含指令
采用頭文件的目的主要是為了使某些定義可以供多個不同的C源程序使用。因為在需要用到這些定義的C源程序中,只需加上一條#include語句即可,而不必再在此文件中將這些定義重復(fù)一遍。預(yù)編譯程序?qū)杨^文件中的定義統(tǒng)統(tǒng)都加入到它所產(chǎn)生的輸出文件中,以供編譯程序?qū)χM(jìn)行處理。
#include預(yù)處理指令的作用是在指令處展開被包含的文件。包含可以是多重的,也就是說一個被包含的文件中還可以包含其他文件。標(biāo)準(zhǔn)C編譯器至少支持八重嵌套包含。預(yù)處理過程不檢查在轉(zhuǎn)換單元中是否已經(jīng)包含了某個文件并阻止對它的多次包含,這個的處理辦法上面已經(jīng)給出。
在程序中包含頭文件有兩種格式:

#include 
#include "my.h"

第一種方法是用尖括號把頭文件括起來。這種格式告訴預(yù)處理程序在編譯器自帶的或外部庫的頭文件中搜索被包含的頭文件。
第二種方法是用雙引號把頭文件括起來。這種格式告訴預(yù)處理程序在當(dāng)前被編譯的應(yīng)用程序的源代碼文件中搜索被包含的頭文件,如果找不到,再搜索編譯器自帶的頭文件。
采用兩種不同包含格式的理由在于,編譯器是安裝在公共子目錄下的,而被編譯的應(yīng)用程序是在它們自己的私有子目錄下的。一個應(yīng)用程序既包含編譯器提供的公共頭文件,也包含自定義的私有頭文件。采用兩種不同的包含格式使得編譯器能夠在很多頭文件中區(qū)別出一組公共的頭文件。
預(yù)編譯程序所完成的基本上是對源程序的“替代”工作。經(jīng)過此種替代,生成一個沒有宏定義、沒有條件編譯指令、沒有特殊符號的輸出文件。這個文件的含義同沒有經(jīng)過預(yù)處理的源文件是相同的,但內(nèi)容有所不同。下一步,此輸出文件將作為編譯程序的輸出而被翻譯成為機(jī)器指令。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • C語言
    +關(guān)注

    關(guān)注

    180

    文章

    7632

    瀏覽量

    141425
  • 編譯
    +關(guān)注

    關(guān)注

    0

    文章

    678

    瀏覽量

    33940
  • 預(yù)處理
    +關(guān)注

    關(guān)注

    0

    文章

    33

    瀏覽量

    10643
  • 宏定義
    +關(guān)注

    關(guān)注

    0

    文章

    51

    瀏覽量

    9218
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    STVD中如何設(shè)置預(yù)編譯選項?

    請問大家一個IDE 的問題 我目前使用的是STVD 的編譯器。 想請問一下, 預(yù)編譯選項 哪里有的設(shè)置。 例如 在 中斷向量 文件中如果 定義了STM8S208 就開
    發(fā)表于 05-13 07:30

    請問有文檔描述ZigBee預(yù)編譯宏定義含義嗎?

    TI ZigBee 技術(shù)牛人:你好!請問有文檔描述了Texas Instruments\Z-Stack Home 1.2.0中預(yù)編譯宏定義詳細(xì)解釋嗎?
    發(fā)表于 08-13 07:51

    未能獲得預(yù)編譯的模擬庫信息

    14.4)---------------------------警告:無法獲得預(yù)編譯的模擬庫信息。要解決此問題,您可以執(zhí)行以下任一操作: - 如果庫已經(jīng)預(yù)編譯,請使用以下方法之一指向它們:*將
    發(fā)表于 03-17 10:17

    什么是預(yù)編譯

    1 預(yù)編譯預(yù)編譯又稱為預(yù)處理 ,處理以# 開頭的指令 , 比如拷貝 #include 包含的文件代碼,#define 宏定義的替換 , 條件編譯等,就是為編譯做的預(yù)備工作的階段。...
    發(fā)表于 07-15 06:03

    Verilog 預(yù)編譯

    Verilog 預(yù)編譯Verilog 語言支持宏定義(`define),參數(shù) parameter,局域參數(shù)(localparam)以及`include等內(nèi)容。這些數(shù)據(jù)常量的支持極大方便數(shù)字系統(tǒng)
    發(fā)表于 08-11 09:31

    什么是預(yù)編譯?什么時候使用預(yù)編譯

    什么是預(yù)編譯?什么時候使用預(yù)編譯呢?
    發(fā)表于 02-25 07:43

    yolov5預(yù)編譯后結(jié)果異常

    轉(zhuǎn)為預(yù)編譯版本后,在rv1126板子上推理結(jié)果異常,完全不相同,又遇到相同問題的大佬可以分享下如何解決嗎?
    發(fā)表于 03-16 19:16

    X-CUBE-IOTA v1.2.0預(yù)編譯版不起作用的原因?如何解決?

    我試圖將我的項目更新到 1.2.0 版本,但沒有成功。我現(xiàn)在還發(fā)現(xiàn) stm32f4 的預(yù)編譯版本不起作用。另外,如果我自己編譯它也行不通。我通過 dhcp 獲得了一個有效的 ip,但該 ip 立即
    發(fā)表于 01-16 06:11

    編譯器如何處理使用預(yù)編譯庫SMING文件編譯的應(yīng)用程序中未使用的庫?

    預(yù)編譯的庫文件,由位于頂部的應(yīng)用程序使用。 編譯器如何處理使用預(yù)編譯庫SMING文件編譯的應(yīng)用程序中未使用的庫?即使未使用,庫也會消耗 RAM 和閃存嗎?是否應(yīng)該刪除這些未使用的庫以節(jié)
    發(fā)表于 06-12 08:54

    C語言編譯器常見的預(yù)編譯指令詳細(xì)資料說明

    編譯器對C程序的處理可以明確地分為兩步。第一步由預(yù)編譯器完成。以#開頭的預(yù)編譯指令可能會影響編譯器設(shè)置或者進(jìn)行文本替換。注意,預(yù)編譯器變量(
    發(fā)表于 06-05 17:52 ?2次下載
    C語言<b class='flag-5'>編譯</b>器常見的<b class='flag-5'>預(yù)編譯</b>指令詳細(xì)資料說明

    "最常見"卻又"最不常用"的三個預(yù)編譯

    然而在我們閱讀一些大型的代碼或者庫的時候,一般都會看到有#error和#warning,可能有些小伙伴一掃而過并沒有了解清楚這些預(yù)編譯指令到底該怎么用,寫了很久的代碼估計也重來沒有敲過他們。
    的頭像 發(fā)表于 11-16 15:55 ?1290次閱讀

    C語言中常見預(yù)編譯指令的靈活秒用

    有時候出于對程序代碼優(yōu)化的考慮。希望只對其中一部分內(nèi)容進(jìn)行編譯。此時就需要在程序中加上條件,讓編譯器只對滿足條件的代碼進(jìn)行編譯,將不滿足條件的代碼舍棄,這就是條件編譯。 常見的
    的頭像 發(fā)表于 04-27 11:18 ?1968次閱讀

    淺談預(yù)編譯指令常見用法

    很多優(yōu)秀的代碼,都會借用預(yù)編譯指令來完善代碼,今天就來講講關(guān)于預(yù)編譯指令的內(nèi)容。 常見的預(yù)處理指令如下: #指令,無任何效果 #include含一個源代碼文件 #define義宏 #undef消已定
    的頭像 發(fā)表于 06-23 17:30 ?1866次閱讀
    淺談<b class='flag-5'>預(yù)編譯</b>指令常見用法

    什么是預(yù)編譯

    預(yù)編譯就是處理以#開頭的指令,比如賦值#include包含的文件、#define宏定義的替換、條件編譯等。預(yù)編譯就是為編譯前做準(zhǔn)備工作的階段,主要處理以#開頭的
    發(fā)表于 01-13 13:52 ?0次下載
    什么是<b class='flag-5'>預(yù)編譯</b>

    【Linux編程】如何使用gcc生成預(yù)編譯文件?

    【Linux編程】如何使用gcc生成預(yù)編譯文件?
    的頭像 發(fā)表于 08-31 13:07 ?2248次閱讀
    【Linux編程】如何使用gcc生成<b class='flag-5'>預(yù)編譯</b>文件?