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

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

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

C預處理器只不過是一個文本替換工具而已

電子工程師 ? 來源:未知 ? 作者:李倩 ? 2018-11-08 14:41 ? 次閱讀

C 預處理器不是編譯器的組成部分,但是它是編譯過程中一個單獨的步驟。簡言之,C預處理器只不過是一個文本替換工具而已,它們會指示編譯器在實際編譯之前完成所需的預處理。我們將把 C 預處理器(C Preprocessor)簡寫為 CPP。

所有的預處理器命令都是以井號(#)開頭。它必須是第一個非空字符,為了增強可讀性,預處理器指令應從第一列開始。下面列出了所有重要的預處理器指令:

預處理器實例

分析下面的實例來理解不同的指令。

#define MAX_ARRAY_LENGTH 20

這個指令告訴 CPP 把所有的 MAX_ARRAY_LENGTH 替換為 20。使用#define定義常量來增強可讀性。

#include#include"myheader.h"

這些指令告訴 CPP 從系統(tǒng)庫中獲取 stdio.h,并添加文本到當前的源文件中。下一行告訴 CPP 從本地目錄中獲取myheader.h,并添加內(nèi)容到當前的源文件中。

#undef FILE_SIZE#define FILE_SIZE 42

這個指令告訴 CPP 取消已定義的 FILE_SIZE,并定義它為 42。

#ifndef MESSAGE #define MESSAGE "You wish!"#endif

這個指令告訴 CPP 只有當 MESSAGE 未定義時,才定義 MESSAGE。

#ifdef DEBUG /* Your debugging statements here */#endif

這個指令告訴 CPP 如果定義了 DEBUG,則執(zhí)行處理語句。在編譯時,如果您向 gcc 編譯器傳遞了-DDEBUG開關量,這個指令就非常有用。它定義了 DEBUG,您可以在編譯期間隨時開啟或關閉調(diào)試。

預定義宏

ANSI C 定義了許多宏。在編程中您可以使用這些宏,但是不能直接修改這些預定義的宏。

讓我們來嘗試下面的實例:

當上面的代碼(在文件test.c中)被編譯和執(zhí)行時,它會產(chǎn)生下列結果:

預處理器運算符

C 預處理器提供了下列的運算符來幫助您創(chuàng)建宏:

宏延續(xù)運算符(\)

一個宏通常寫在一個單行上。但是如果宏太長,一個單行容納不下,則使用宏延續(xù)運算符(\)。例如:

#define message_for(a, b) \ printf(#a " and "#b ": We love you!\n")

字符串常量化運算符(#)

在宏定義中,當需要把一個宏的參數(shù)轉(zhuǎn)換為字符串常量時,則使用字符串常量化運算符(#)。在宏中使用的該運算符有一個特定的參數(shù)或參數(shù)列表。例如:

當上面的代碼被編譯和執(zhí)行時,它會產(chǎn)生下列結果:

CaroleandDebra:We love you!

標記粘貼運算符(##)

宏定義內(nèi)的標記粘貼運算符(##)會合并兩個參數(shù)。它允許在宏定義中兩個獨立的標記被合并為一個標記。例如:

當上面的代碼被編譯和執(zhí)行時,它會產(chǎn)生下列結果:

token34 =40

這是怎么發(fā)生的,因為這個實例會從編譯器產(chǎn)生下列的實際輸出:

printf ("token34 = %d", token34);

這個實例演示了 token##n 會連接到 token34 中,在這里,我們使用了字符串常量化運算符(#)和標記粘貼運算符(##)。

defined() 運算符

預處理器defined運算符是用在常量表達式中的,用來確定一個標識符是否已經(jīng)使用 #define 定義過。如果指定的標識符已定義,則值為真(非零)。如果指定的標識符未定義,則值為假(零)。下面的實例演示了 defined() 運算符的用法:

當上面的代碼被編譯和執(zhí)行時,它會產(chǎn)生下列結果:

Hereis the message:You wish!

參數(shù)化的宏

CPP 一個強大的功能是可以使用參數(shù)化的宏來模擬函數(shù)。例如,下面的代碼是計算一個數(shù)的平方:

int square(int x){ return x * x;}

我們可以使用宏重寫上面的代碼,如下:

#define square(x)((x)*(x))

在使用帶有參數(shù)的宏之前,必須使用#define指令定義。參數(shù)列表是括在圓括號內(nèi),且必須緊跟在宏名稱的后邊。宏名稱和左圓括號之間不允許有空格。例如:

#include#define MAX(x,y)((x)>(y)?(x):(y))int main(void){ printf("Max between 20 and 10 is %d\n", MAX(10,20)); return0;}

當上面的代碼被編譯和執(zhí)行時,它會產(chǎn)生下列結果:

Max between 20and10is20

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

    關注

    1

    文章

    1602

    瀏覽量

    48896
  • 預處理器
    +關注

    關注

    0

    文章

    13

    瀏覽量

    2213

原文標題:C語言中的預處理器

文章出處:【微信號:c-stm32,微信公眾號:STM32嵌入式開發(fā)】歡迎添加關注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關推薦

    Python文本預處理的基本步驟,討論文本預處理過程所需要的工具

    詞性標注旨在基于詞語的定義和上下文意義,為給定文本中的每個單詞(如名詞、動詞、形容詞和其他單詞) 分配詞性。當前有許多包含 POS 標記工具,包括 NLTK,spaCy,TextBlob
    的頭像 發(fā)表于 01-28 09:26 ?4793次閱讀

    瀾啟第6套字典算法替換工具

    中九瀾啟方案第6套字典算法替換工具(2011-9-22更新)請在替換前面打鉤,然后將瀾起文件拖入就OK了,文件保存在同文件夾中
    發(fā)表于 09-23 13:24

    編程是種思維方式,而代碼是種表現(xiàn)形式,硬件只不過是對思維方式的物理體現(xiàn)

    編程是種思維方式,而代碼是種表現(xiàn)形式,硬件只不過是對思維方式的物理體現(xiàn)關于這句話,你怎么看?
    發(fā)表于 08-25 13:18

    C語言之預處理

    編譯預處理器C語言編譯重要組成部分。很好的利用C語言的
    發(fā)表于 06-03 17:23

    E2413C Motorola ***預處理器接口

    E2413C Motorola ***預處理器接口
    發(fā)表于 03-14 20:20

    Post綜合后的利用率只不過是實施后的利用率?

    嗨,Post綜合后的利用率只不過是實施后的利用率......?謝謝娜文G K.
    發(fā)表于 05-12 08:57

    c語言預處理命令以什么開頭

    c語言預處理命令以什么開頭,目前我并沒有windows軟件編寫經(jīng)驗,對C語言的應用也僅限于各種單片機的編程,所以對預處理的理解也只限于單片機程序上。
    發(fā)表于 07-20 07:00

    C語言的編譯預處理

    在將C源程序轉(zhuǎn)換為可執(zhí)行程序的過程中, 編譯預處理是最初的步驟. 這步驟是由預處理器(pr
    發(fā)表于 09-20 18:17 ?47次下載

    預處理器的工作原理作用

    預處理器的工作原理作用,希望對學者們有幫助。
    發(fā)表于 10-29 11:40 ?0次下載

    嵌入式C預處理器的基本概念和常用指令

    在嵌入式系統(tǒng)開發(fā)中,C預處理器是非常重要的部分,可以在編譯之前對源代碼進行宏替換、條件編譯和包含等處理。在本文中,我們將介紹嵌入式
    的頭像 發(fā)表于 04-13 16:11 ?798次閱讀

    介紹嵌入式C預處理器的基本概念和常用指令

    在嵌入式系統(tǒng)開發(fā)中,C預處理器是非常重要的部分,可以在編譯之前對源代碼進行宏替換、條件編譯和包含等處理。
    發(fā)表于 05-20 15:14 ?436次閱讀

    預處理相關知識點總結

    編譯 C 程序設計很多步驟。其中第 1 步驟被稱為預處理階段。C
    的頭像 發(fā)表于 05-31 09:52 ?528次閱讀
    <b class='flag-5'>預處理</b>相關知識點總結

    C語言有哪些預處理操作?

    C語言的預處理是在編譯之前對源代碼進行處理的階段,它主要由預處理器完成。預處理器
    的頭像 發(fā)表于 12-08 15:40 ?472次閱讀
    <b class='flag-5'>C</b>語言有哪些<b class='flag-5'>預處理</b>操作?

    C語言中的預處理器

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

    C預處理器及其工作原理

    C預處理器C Pre-Processor)也常簡寫為 CPP,是C 編譯
    的頭像 發(fā)表于 03-12 14:14 ?483次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>預處理器</b>及其工作原理