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

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

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

C語言程序時(shí)經(jīng)常使用庫函數(shù)之前的預(yù)處理是什么?

GReq_mcu168 ? 來源:CSDN ? 作者:木槿花better ? 2021-04-16 09:47 ? 次閱讀

我們?cè)趯?a href="http://wenjunhu.com/soft/data/21-24/" target="_blank">C語言程序時(shí)經(jīng)常使用庫函數(shù)之前,應(yīng)該用#include引入對(duì)應(yīng)的頭文件。這種以#號(hào)開頭的命令稱為預(yù)處理命令。但是你對(duì)C語言的預(yù)處理了解多少呢?快來跟著斌哥一起學(xué)習(xí)一下C語言中的預(yù)處理吧!推薦關(guān)注下方公眾號(hào)學(xué)習(xí)更多電子技術(shù)知識(shí)!

一、預(yù)處理是什么?預(yù)處理指令是以#號(hào)開頭的代碼行。#號(hào)必須是該行除了任何空白字符外的第一個(gè)字符。#后是指令關(guān)鍵字,在關(guān)鍵字和#號(hào)之間允許存在任意個(gè)數(shù)的空白字符。整行語句構(gòu)成了一條預(yù)處理指令,該指令將在編譯器進(jìn)行編譯之前對(duì)源代碼做某些轉(zhuǎn)換。下面是部分預(yù)處理指令:

a0257bc0-9e2c-11eb-8b86-12bb97331649.png

還有下列幾種預(yù)處理宏(是雙下劃線)

__LINE__ 表示正在編譯的文件的行號(hào)__FILE__表示正在編譯的文件的名字__DATE__表示編譯時(shí)刻的日期字符串__TIME__ 表示編譯時(shí)刻的時(shí)間字符串__STDC__ 判斷該文件是不是定義成標(biāo)準(zhǔn) C 程序

二、預(yù)處理有什么用?在集成開發(fā)環(huán)境中,編譯,鏈接是同時(shí)完成的。其實(shí),C語言編譯器在對(duì)源代碼編譯之前,還需要進(jìn)一步的處理:預(yù)編譯。

所以,完整的步驟是:預(yù)編譯 -》 編譯 -》 鏈接預(yù)編譯的主要作用如下:

1.將源文件中以”include”格式包含的文件復(fù)制到編譯的源文件中。2.用實(shí)際值替換用“#define”定義的字符串。3.根據(jù)“#if”后面的條件決定需要編譯的代碼。

預(yù)處理是C語言的一個(gè)重要功能,由預(yù)處理程序完成。當(dāng)對(duì)一個(gè)源文件進(jìn)行編譯時(shí),系統(tǒng)將自動(dòng)調(diào)用預(yù)處理程序?qū)υ闯绦蛑械念A(yù)處理部分作處理,處理完畢自動(dòng)進(jìn)入對(duì)源程序的編譯。

預(yù)處理的行為是由指令控制的。這些指令是由#字符開頭的一些命令。

#define指令定義了一個(gè)宏---用來代表其他東西的一個(gè)命令,通常是某一個(gè)類型的常量。預(yù)處理會(huì)通過將宏的名字和它的定義存儲(chǔ)在一起來響應(yīng)#define指令。當(dāng)這個(gè)宏在后面的程序中使用到時(shí),預(yù)處理器”擴(kuò)展”了宏,將宏替換為它所定義的值。例如:下面這行命令:

1#define PI 3.141592654

#include指令告訴預(yù)處理器打開一個(gè)特定的文件,將它的內(nèi)容作為正在編譯的文件的一部分“包含”進(jìn)來。例如:下面這行命令:

1#include《stdio.h》

指示預(yù)處理器打開一個(gè)名字為stdio.h的文件,并將它的內(nèi)容加到當(dāng)前的程序中。

預(yù)處理器的輸入是一個(gè)C語言程序,程序可能包含指令。預(yù)處理器會(huì)執(zhí)行這些指令,并在處理過程中刪除這些指令。預(yù)處理器的輸出是另外一個(gè)程序:原程序的一個(gè)編輯后的版本,不再包含指令。預(yù)處理器的輸出被直接交給編譯器,編譯器檢查程序是否有錯(cuò)誤,并經(jīng)程序翻譯為目標(biāo)代碼。

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

宏定義了一個(gè)代表特定內(nèi)容的標(biāo)識(shí)符。預(yù)處理過程會(huì)把源代碼中出現(xiàn)的宏標(biāo)識(shí)符替換成宏定義時(shí)的值。宏最常見的用法是定義代表某個(gè)值的全局符號(hào)。宏的第二種用 法是定義帶參數(shù)的宏(宏函數(shù)),這樣的宏可以象函數(shù)一樣被調(diào)用,但它是在調(diào)用語句處展開宏,并用調(diào)用時(shí)的實(shí)際參數(shù)來代替定義中的形式參數(shù)。

1.1 #define指令

1.1.1 #define預(yù)處理指令用來定義宏。該指令最簡(jiǎn)單的格式是:聲明一個(gè)標(biāo)識(shí)符,給出這個(gè)標(biāo)識(shí)符代表的代碼(比如像圓周率這樣的數(shù))。在后面的源代碼中,我們就可以使用定義的宏取代要使用的代碼,代碼舉例:

#define PI 3.141592654

1.1.2 使用宏的好處有兩點(diǎn)

一是使用方便。如下:

#define PI 3.1415926

PI顯然比3.1415926寫著方便。

二是定義的宏有了意義,可讀性強(qiáng)。如例1,MAX_NUM,望文生意便知是最大數(shù)量的意思,比單純使用10這個(gè)數(shù)字可讀性要強(qiáng)的多。

三是容易修改。如例1,如果在程序中有幾十次會(huì)使用到MAX_NUM,修改只需要在宏定義里面修改一次就可以,否則你會(huì)修改到崩潰。

2、條件編譯指令

程序員可以通過定義不同的宏來決定編譯程序?qū)δ男┐a進(jìn)行處理。條件編譯指令將決定哪些代碼被編譯,而哪些是不被編譯的??梢愿鶕?jù)表達(dá)式的值或者某個(gè)特定的宏是否被定義來確定編譯條件。

2.1 #if/#endif/#else/#elif指令

#if指令檢測(cè)跟在制造另關(guān)鍵字后的常量表達(dá)式。如果表達(dá)式為真,則編譯后面的代碼,直到出現(xiàn)#else、#elif或#endif為止;否則就不編譯。

#endif用于終止#if預(yù)處理指令。#else指令用于某個(gè)#if指令之后,當(dāng)前面的#if指令的條件不為真時(shí),就編譯#else后面的代碼。

代碼舉例

#define DEBUG //此時(shí)#ifdef DEBUG為真//#define DEBUG 0 //此時(shí)為假int main(){ #ifdef DEBUG printf(“Debugging

”); #else printf(“Not debugging

”); #endif printf(“Running

”); return 0;}

這樣我們就可以實(shí)現(xiàn)debug功能,每次要輸出調(diào)試信息前,只需要#ifdef DEBUG判斷一次。不需要了就在文件開始定義#define DEBUG 0

#elif預(yù)處理指令綜合了#else和#if指令的作用。

3、頭文件包含指令

采用頭文件的目的主要是為了使某些定義可以供多個(gè)不同的C源程序使用。因?yàn)樵谛枰玫竭@些定義的C源程序中,只需加上一條#include語句即可,而不必再在此文件中將這些定義重復(fù)一遍。預(yù)編譯程序?qū)杨^文件中的定義統(tǒng)統(tǒng)都加入到它所產(chǎn)生的輸出文件中,以供編譯程序?qū)χM(jìn)行處理。

#include預(yù)處理指令的作用是在指令處展開被包含的文件。包含可以是多重的,也就是說一個(gè)被包含的文件中還可以包含其他文件。標(biāo)準(zhǔn)C編譯器至少支持八重嵌套包含。預(yù)處理過程不檢查在轉(zhuǎn)換單元中是否已經(jīng)包含了某個(gè)文件并阻止對(duì)它的多次包含,這個(gè)的處理辦法上面已經(jīng)給出。

在程序中包含頭文件有兩種格式:

#include 《my.h》 #include “my.h”

第一種方法是用尖括號(hào)把頭文件括起來。這種格式告訴預(yù)處理程序在編譯器自帶的或外部庫的頭文件中搜索被包含的頭文件。第二種方法是用雙引號(hào)把頭文件括起 來。這種格式告訴預(yù)處理程序在當(dāng)前被編譯的應(yīng)用程序的源代碼文件中搜索被包含的頭文件,如果找不到,再搜索編譯器自帶的頭文件。

采用兩種不同包含格式的理由在于,編譯器是安裝在公共子目錄下的,而被編譯的應(yīng)用程序是在它們自己的私有子目錄下的。一個(gè)應(yīng)用程序既包含編譯器提供的公共 頭文件,也包含自定義的私有頭文件。采用兩種不同的包含格式使得編譯器能夠在很多頭文件中區(qū)別出一組公共的頭文件。

四、小結(jié)預(yù)編譯程序所完成的基本上是對(duì)源程序的“替代”工作。經(jīng)過此種替代,生成一個(gè)沒有宏定義、沒有條件編譯指令、沒有特殊符號(hào)的輸出文件。這個(gè)文件的含義同沒有經(jīng)過預(yù)處理的源文件是相同的,但內(nèi)容有所不同。下一步,此輸出文件將作為編譯程序的輸出而被翻譯成為機(jī)器指令。

原文標(biāo)題:C語言預(yù)處理命令你知道多少?

文章出處:【微信公眾號(hào):玩轉(zhuǎn)單片機(jī)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

責(zé)任編輯:haq

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

    關(guān)注

    180

    文章

    7604

    瀏覽量

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

    關(guān)注

    0

    文章

    33

    瀏覽量

    10487

原文標(biāo)題:C語言預(yù)處理命令你知道多少?

文章出處:【微信號(hào):mcu168,微信公眾號(hào):硬件攻城獅】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    使用C語言實(shí)現(xiàn)函數(shù)模板

      用C語言能不能實(shí)現(xiàn)一個(gè)通用的函數(shù),既能完成整數(shù)的相加,又能完成浮點(diǎn)數(shù)的相加?
    的頭像 發(fā)表于 11-09 11:38 ?390次閱讀

    C語言中的socket編程基礎(chǔ)

    Socket編程簡(jiǎn)介 Socket是一種通信機(jī)制,允許程序之間進(jìn)行通信。在C語言中,socket編程是網(wǎng)絡(luò)編程的基礎(chǔ)。通過使用socket,程序可以發(fā)送和接收數(shù)據(jù),實(shí)現(xiàn)不同計(jì)算機(jī)之間的
    的頭像 發(fā)表于 11-01 16:51 ?325次閱讀

    C55x CSL音頻預(yù)處理

    電子發(fā)燒友網(wǎng)站提供《C55x CSL音頻預(yù)處理.pdf》資料免費(fèi)下載
    發(fā)表于 09-19 11:30 ?0次下載
    <b class='flag-5'>C</b>55x CSL音頻<b class='flag-5'>預(yù)處理</b>

    nlp自然語言處理模型怎么做

    自然語言處理(Natural Language Processing,簡(jiǎn)稱NLP)是人工智能領(lǐng)域的一個(gè)重要分支,它涉及到計(jì)算機(jī)對(duì)人類語言的理解和生成。隨著深度學(xué)習(xí)技術(shù)的發(fā)展,NLP領(lǐng)域取得了顯著
    的頭像 發(fā)表于 07-05 09:59 ?639次閱讀

    信號(hào)的預(yù)處理包括哪些環(huán)節(jié)

    信號(hào)預(yù)處理是信號(hào)處理的一個(gè)重要環(huán)節(jié),它對(duì)信號(hào)進(jìn)行一系列的操作,以便于后續(xù)的分析和處理。信號(hào)預(yù)處理的目的是提高信號(hào)的質(zhì)量,減少噪聲,保留有用的信息,以及滿足后續(xù)
    的頭像 發(fā)表于 06-03 10:35 ?3037次閱讀

    怎么開始學(xué)習(xí)stm8l的庫函數(shù)?

    之前用的都是51單片機(jī),雖然有上過stm32的課但是當(dāng)時(shí)忙于考研基本沒學(xué),對(duì)庫函數(shù)根本不了解,現(xiàn)在我參加一個(gè)需要用stm8l做環(huán)境檢測(cè)和無線組網(wǎng)的項(xiàng)目,想知道該怎么快速上手stm8l。應(yīng)該怎么開始學(xué)習(xí)stm8l的庫函數(shù),各位有
    發(fā)表于 05-11 08:12

    請(qǐng)問為什么非main.c的其他文件能調(diào)用庫函數(shù)

    在main.c中調(diào)用庫函數(shù)我可能理解: 是因?yàn)樵趍ain.c中引用了#include \"sys.h\"頭文件,而這個(gè)頭文件包含了各庫函數(shù)的定義聲明。 但其他文件諸如這樣
    發(fā)表于 04-25 06:49

    C預(yù)處理器及其工作原理

    C預(yù)處理器(C Pre-Processor)也常簡(jiǎn)寫為 CPP,是一個(gè)與 C 編譯器獨(dú)立的小程序,預(yù)編譯器并不理解
    的頭像 發(fā)表于 03-12 14:14 ?641次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>預(yù)處理</b>器及其工作原理

    C語言#define的應(yīng)用

    C/C++ 編程語言中,當(dāng)程序被編譯時(shí),被發(fā)送到編譯器,編譯器將程序轉(zhuǎn)換為機(jī)器語言,然后完成
    發(fā)表于 03-06 11:29 ?380次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言</b>#define的應(yīng)用

    C語言中的預(yù)處理

    所有的預(yù)處理器命令都是以井號(hào)(#)開頭。它必須是第一個(gè)非空字符,為了增強(qiáng)可讀性,預(yù)處理器指令應(yīng)從第一列開始。
    發(fā)表于 03-01 12:16 ?918次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言</b>中的<b class='flag-5'>預(yù)處理</b>器

    C語言中的頭文件

    #include 指令會(huì)指示 C 預(yù)處理器瀏覽指定的文件作為輸入。預(yù)處理器的輸出包含了已經(jīng)生成的輸出,被引用文件生成的輸出以及 #include 指令之后的文本輸出。
    發(fā)表于 02-23 14:06 ?463次閱讀

    TC397怎么添加標(biāo)準(zhǔn)C庫函數(shù)?

    想使用一些標(biāo)準(zhǔn)的C庫函數(shù),如math.h中的一些sin,cos等函數(shù),但是不知道怎么添加,請(qǐng)問有人操作過這種嗎,請(qǐng)賜教。
    發(fā)表于 02-02 08:04

    學(xué)習(xí)筆記分享|使用C庫函數(shù)控制ELF 1開發(fā)板的LED

    (ELF1/ELF1S開發(fā)板及顯示屏)在嵌入式Linux系統(tǒng)開發(fā)中,通過編程控制硬件資源是至關(guān)重要的技能之一,今天跟各位小伙伴分享一篇專注于介紹如何使用C庫函數(shù)控制ELF1開發(fā)板LED的學(xué)習(xí)筆記
    的頭像 發(fā)表于 01-19 11:12 ?571次閱讀
    學(xué)習(xí)筆記分享|使用<b class='flag-5'>C</b><b class='flag-5'>庫函數(shù)</b>控制ELF 1開發(fā)板的LED

    為什么我的電腦在燒錄程序時(shí)經(jīng)常藍(lán)屏?

    為什么我的電腦在燒錄程序時(shí)經(jīng)常藍(lán)屏
    發(fā)表于 01-19 07:27

    怎么寫出效率高、思路清晰的C語言程序?

    要用C語言的思維方式來進(jìn)行程序的構(gòu)架構(gòu)建 要有良好的C語言算法基礎(chǔ),以此來實(shí)現(xiàn)程序的邏輯構(gòu)架
    的頭像 發(fā)表于 01-02 14:20 ?572次閱讀