女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

預編譯的理解及作用原理

嵌入式應用開發 ? 來源:嵌入式應用開發 ? 作者:嵌入式應用開發 ? 2022-12-29 17:07 ? 次閱讀
poYBAGOtWAqAR7InAAEgB0IqMEU843.png

三種預處理詳解
1、宏定義指令

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

#define PI 3.141592654

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

#define PI 3.1415926

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

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

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

3、頭文件包含指令
采用頭文件的目的主要是為了使某些定義可以供多個不同的C源程序使用。因為在需要用到這些定義的C源程序中,只需加上一條#include語句即可,而不必再在此文件中將這些定義重復一遍。預編譯程序將把頭文件中的定義統統都加入到它所產生的輸出文件中,以供編譯程序對之進行處理。
#include預處理指令的作用是在指令處展開被包含的文件。包含可以是多重的,也就是說一個被包含的文件中還可以包含其他文件。標準C編譯器至少支持八重嵌套包含。預處理過程不檢查在轉換單元中是否已經包含了某個文件并阻止對它的多次包含,這個的處理辦法上面已經給出。
在程序中包含頭文件有兩種格式:

#include 
#include "my.h"

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

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • C語言
    +關注

    關注

    180

    文章

    7630

    瀏覽量

    140477
  • 編譯
    +關注

    關注

    0

    文章

    676

    瀏覽量

    33761
  • 預處理
    +關注

    關注

    0

    文章

    33

    瀏覽量

    10610
  • 宏定義
    +關注

    關注

    0

    文章

    51

    瀏覽量

    9182
收藏 人收藏

    評論

    相關推薦
    熱點推薦

    STVD中如何設置預編譯選項?

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

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

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

    未能獲得預編譯的模擬庫信息

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

    什么是預編譯

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

    Verilog 預編譯

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

    什么是預編譯?什么時候使用預編譯

    什么是預編譯?什么時候使用預編譯呢?
    發表于 02-25 07:43

    yolov5預編譯后結果異常

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

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

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

    編譯器如何處理使用預編譯庫SMING文件編譯的應用程序中未使用的庫?

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

    C語言編譯器常見的預編譯指令詳細資料說明

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

    "最常見"卻又"最不常用"的三個預編譯

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

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

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

    淺談預編譯指令常見用法

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

    什么是預編譯

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

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

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