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

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

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

淺談?lì)A(yù)編譯指令常見用法

strongerHuang ? 來(lái)源:小麥大叔 ? 作者:小麥大叔 ? 2021-06-23 17:30 ? 次閱讀

很多優(yōu)秀的代碼,都會(huì)借用預(yù)編譯指令來(lái)完善代碼,今天就來(lái)講講關(guān)于預(yù)編譯指令的內(nèi)容。

常見的預(yù)處理指令如下:

#指令,無(wú)任何效果

#include含一個(gè)源代碼文件

#define義宏

#undef消已定義的宏

#if果給定條件為真,則編譯下面代碼

#ifdef果宏已經(jīng)定義,則編譯下面代碼

#ifndef果宏沒有定義,則編譯下面代碼

#elif果前面的if定條件不為真,當(dāng)前條件為真,則編譯下面代碼

#endif束一個(gè)if……#else件編譯塊

#error止編譯并顯示錯(cuò)誤信息

本來(lái)只是想了解一下#ifdef,#ifndef,#endif的,沒想到查出來(lái)這么多的預(yù)處理指令,上面的多數(shù)都是常見的,但是平時(shí)沒有怎么注意預(yù)處理這方面的內(nèi)容,所以這里梳理一下知識(shí)吧。

同時(shí)有什么不妥的地方,或者遺漏了什么內(nèi)容,還請(qǐng)留言指出。

什么是預(yù)處理指令?

預(yù)處理指令是以#號(hào)開頭的代碼行。#號(hào)必須是該行除了任何空白字符外的第一個(gè)字符。#后是指令關(guān)鍵字,在關(guān)鍵字和#號(hào)之間允許存在任意個(gè)數(shù)的空白字符。整行語(yǔ)句構(gòu)成了一條預(yù)處理指令,該指令將在編譯器進(jìn)行編譯之前對(duì)源代碼做某些轉(zhuǎn)換。
預(yù)處理指令是在編譯器進(jìn)行編譯之前進(jìn)行的操作,對(duì)其進(jìn)行初步的轉(zhuǎn)換,產(chǎn)生新的源代碼提供給編譯器??梢婎A(yù)處理過程先于編譯器對(duì)源代碼進(jìn)行處理。在很多編程語(yǔ)言中,并沒有任何內(nèi)在的機(jī)制來(lái)完成如下一些功能:在編譯時(shí)包含其他源文件、定義宏、根據(jù)條件決定編譯時(shí)是否包含某些代碼(防止重復(fù)包含某些文件)。
要完成這些工作,就需要使用預(yù)處理程序。盡管在目前絕大多數(shù)編譯器都包含了預(yù)處理程序,但通常認(rèn)為它們是獨(dú)立于編譯器的。預(yù)處理過程讀入源代碼,檢查包含預(yù)處理指令的語(yǔ)句和宏定義,并對(duì)源代碼進(jìn)行響應(yīng)的轉(zhuǎn)換。預(yù)處理過程還會(huì)刪除程序中的注釋和多余的空白字符。#include包含一個(gè)源代碼文件這個(gè)預(yù)處理指令,我想是見得最多的一個(gè),簡(jiǎn)單說一下;

第一種方法是用尖括號(hào)把頭文件括起來(lái)。

#include 《stdio.h》

這種格式告訴預(yù)處理程序在編譯器自帶的或外部庫(kù)的頭文件中搜索被包含的頭文件。

第二種方法是用雙引號(hào)把頭文件括起來(lái)。

#include “test.h”

這種格式告訴預(yù)處理程序在當(dāng)前被編譯的應(yīng)用程序的源代碼文件中搜索被包含的頭文件,如果找不到,再搜索編譯器自帶的頭文件。采用兩種不同包含格式的理由在于,編譯器是安裝在公共子目錄下的,而被編譯的應(yīng)用程序是在它們自己的私有子目錄下的。
一個(gè)應(yīng)用程序既包含編譯器提供的公共頭文件,也包含自定義的私有頭文件。采用兩種不同的包含格式使得編譯器能夠在很多頭文件中區(qū)別出一組公共的頭文件。#define定義宏有關(guān)#define這個(gè)宏定義,在C語(yǔ)言中使用的很多,因?yàn)?define存在一些不足,C++強(qiáng)調(diào)使用const來(lái)定義常量。宏定義了一個(gè)代表特定內(nèi)容的標(biāo)識(shí)符。預(yù)處理過程會(huì)把源代碼中出現(xiàn)的宏標(biāo)識(shí)符替換成宏定義時(shí)的值。記住僅僅是進(jìn)行標(biāo)識(shí)符的替換。下面列舉一些#define的使用:

用#define實(shí)現(xiàn)求最大值和最小值的宏

#include 《stdio.h》

#define MAX(x,y) (((x)》(y))?(x):(y))

#define MIN(x,y) (((x)《(y))?(x):(y))

int main(void)

{

#ifdef MAX //判斷這個(gè)宏是否被定義

printf(“3 and 5 the max is:%d

”,MAX(3,5));

#endif

#ifdef MIN

printf(“3 and 5 the min is:%d

”,MIN(3,5));

#endif

return 0;

}

/*

* (1)三元運(yùn)算符要比if,else效率高

* (2)宏的使用一定要細(xì)心,需要把參數(shù)小心的用括號(hào)括起來(lái),

* 因?yàn)楹曛皇呛?jiǎn)單的文本替換,不注意,容易引起歧義錯(cuò)誤。

*/

宏定義的錯(cuò)誤使用

#include 《stdio.h》#define SQR(x) (x*x)int main(void)

{

int b=3;

#ifdef SQR//只需要宏名就可以了,不需要參數(shù),有參數(shù)的話會(huì)警告

printf(“a = %d

”,SQR(b+2));

#endif

return 0;

}

/*

*首先說明,這個(gè)宏的定義是錯(cuò)誤的。并沒有實(shí)現(xiàn)程序中的B+2的平方

* 預(yù)處理的時(shí)候,替換成如下的結(jié)果:b+2*b+2

* 正確的宏定義應(yīng)該是:#define SQR(x) ((x)*(x))

* 所以,盡量使用小括號(hào),將參數(shù)括起來(lái)。

*/

宏參數(shù)的連接

#include 《stdio.h》#define STR(s) #s#define CONS(a,b) (int)(a##e##b)int main(void)

{

#ifdef STR

printf(STR(VCK));

#endif#ifdef CONS

printf(“

%d

”,CONS(2,3));

#endif

return 0;

}

/* (絕大多數(shù)是使用不到這些的,使用到的話,查看手冊(cè)就可以了)

* 第一個(gè)宏,用#把參數(shù)轉(zhuǎn)化為一個(gè)字符串

* 第二個(gè)宏,用##把2個(gè)宏參數(shù)粘合在一起,及aeb,2e3也就是2000

*/

用宏得到一個(gè)字的高位或低位的字節(jié)

#include 《stdio.h》#define WORD_LO(xxx) ((byte)((word)(xxx) & 255))#define WORD_HI(xxx) ((byte)((word)(xxx) 》》 8))int main(void)

{

return 0;

}

/*

* 一個(gè)字2個(gè)字節(jié),獲得低字節(jié)(低8位),與255(0000,0000,1111,1111)按位相與

* 獲得高字節(jié)(高8位),右移8位即可。

*/

用宏定義得到一個(gè)數(shù)組所含元素的個(gè)數(shù)

#include 《stdio.h》#define ARR_SIZE(a) (sizeof((a))/sizeof((a[0])))int main(void)

{

int array[100];

#ifdef ARR_SIZE

printf(“array has %d items.

”,ARR_SIZE(array));

#endif

return 0;

}

/*

*總的大小除以每個(gè)類型的大小

*/

關(guān)于#define宏的使用,應(yīng)該特別小心,尤其是含有參數(shù)計(jì)算的時(shí)候如下2示例,最保險(xiǎn)的做法將參數(shù)用括號(hào)括起來(lái)。#ifdef,#ifndef,#endif.。。的使用以上這些預(yù)編譯指令,都是條件編譯指令,也就是說,將決定那些代碼被編譯,而哪些不被編譯。

示例1:

#include 《stdio.h》#include 《stdlib.h》#define DEBUGint main(void)

{

int i = 0;

char c;

while(1)

{

i++;

c = getchar();

if(‘

’ != c)

{

getchar();

}

if(‘q’ == c || ‘Q’ == c)

{

#ifdef DEBUG//判斷DEBUG是否被定義了

printf(“We get:%c,about to exit.

”,c);

#endif

break;

}

else

{

printf(“i = %d”,i);

#ifdef DEBUG

printf(“,we get:%c”,c);

#endif

printf(“

”);

}

}

printf(“Hello World!

”);

return 0;

}

/*#endif用于終止#if預(yù)處理指令。*/

ifdef 和 #ifndef

#include 《stdio.h》#define DEBUG

main()

{

#ifdef DEBUG

printf(“yes ”);

#endif#ifndef DEBUG

printf(“no ”);

#endif

}

//#ifdefined等價(jià)于#ifdef;//#if!defined等價(jià)于#ifndef

#else指令

#elif指令

其他一些指令

#error指令將使編譯器顯示一條錯(cuò)誤信息,然后停止編譯。

#line指令可以改變編譯器用來(lái)指出警告和錯(cuò)誤信息的文件號(hào)和行號(hào)。

#pragma令沒有正式的定義。編譯器可以自定義其用途。典型的用法是禁止或允許某些煩人的警告信息。

編輯:jq

聲明:本文內(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++
    C++
    +關(guān)注

    關(guān)注

    22

    文章

    2108

    瀏覽量

    73651
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4788

    瀏覽量

    68616
  • 編譯器
    +關(guān)注

    關(guān)注

    1

    文章

    1634

    瀏覽量

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

    關(guān)注

    0

    文章

    657

    瀏覽量

    32872

原文標(biāo)題:預(yù)編譯指令常見用法

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

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Triton編譯器如何提升編程效率

    開發(fā)者能夠更快地開發(fā)出更高效的軟件。 1. 代碼優(yōu)化 1.1 編譯時(shí)優(yōu)化 Triton 編譯器在編譯時(shí)進(jìn)行了大量的代碼優(yōu)化。這些優(yōu)化包括但不限于: 指令選擇 :Triton
    的頭像 發(fā)表于 12-25 09:12 ?182次閱讀

    Triton編譯器的優(yōu)化技巧

    在現(xiàn)代計(jì)算環(huán)境中,編譯器的性能對(duì)于軟件的運(yùn)行效率至關(guān)重要。Triton 編譯器作為一個(gè)先進(jìn)的編譯器框架,提供了一系列的優(yōu)化技術(shù),以確保生成的代碼既高效又適應(yīng)不同的硬件架構(gòu)。 1. 指令
    的頭像 發(fā)表于 12-25 09:09 ?179次閱讀

    Triton編譯器的常見問題解決方案

    Triton編譯器作為一款專注于深度學(xué)習(xí)的高性能GPU編程工具,在使用過程中可能會(huì)遇到一些常見問題。以下是一些常見問題的解決方案: 一、安裝與依賴問題 檢查Python版本 Triton編譯
    的頭像 發(fā)表于 12-24 18:04 ?379次閱讀

    數(shù)控車床m99指令用法

    我們將詳細(xì)介紹M99指令用法?! ∫?、M99指令的基本含義  M99指令是數(shù)控車床編程中的一個(gè)輔助功能代碼,其基本含義是“程序結(jié)束并返回到程序開始處”。在數(shù)控車床的程序中,M99
    的頭像 發(fā)表于 10-23 15:52 ?699次閱讀

    淺談Vivado編譯時(shí)間

    隨著FPGA規(guī)模的增大,設(shè)計(jì)復(fù)雜度的增加,Vivado編譯時(shí)間成為一個(gè)不可回避的話題。尤其是一些基于SSI芯片的設(shè)計(jì),如VU9P/VU13P/VU19P等,布局布線時(shí)間更是顯著增加。當(dāng)然,對(duì)于一些設(shè)計(jì)而言,十幾個(gè)小時(shí)是合理的。但我們依然試圖分析設(shè)計(jì)存在的問題以期縮短編譯時(shí)
    的頭像 發(fā)表于 09-18 10:43 ?946次閱讀
    <b class='flag-5'>淺談</b>Vivado<b class='flag-5'>編譯</b>時(shí)間

    三菱PLC傳送指令用法

    三菱PLC(可編程邏輯控制器)在工業(yè)自動(dòng)化領(lǐng)域中扮演著至關(guān)重要的角色。其中,傳送指令(MOV)作為PLC編程中的基礎(chǔ)指令之一,其正確使用對(duì)于實(shí)現(xiàn)數(shù)據(jù)的準(zhǔn)確、高效傳輸至關(guān)重要。本文將詳細(xì)講解三菱PLC傳送指令(MOV)的
    的頭像 發(fā)表于 06-18 09:41 ?4183次閱讀

    PLC中SFTL指令用法

    Left Logical)指令是PLC指令集中的一種重要指令,用于處理數(shù)據(jù)的左移操作。本文將詳細(xì)闡述PLC指令SFTL的用法,包括其定義、
    的頭像 發(fā)表于 06-15 17:48 ?3383次閱讀

    數(shù)控車床m99指令用法

    詳細(xì)介紹M99指令用法。 一、M99指令的基本含義 M99指令是數(shù)控車床編程中的一個(gè)輔助功能代碼,其基本含義是“程序結(jié)束并返回到程序開始處”。在數(shù)控車床的程序中,M99
    的頭像 發(fā)表于 06-14 15:52 ?4765次閱讀

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

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

    鴻蒙OpenHarmony:【常見編譯問題和解決方法】

    常見編譯問題和解決方法
    的頭像 發(fā)表于 05-11 16:09 ?2209次閱讀

    Vivado編譯常見錯(cuò)誤與關(guān)鍵警告梳理與解析

    Xilinx Vivado開發(fā)環(huán)境編譯HDL時(shí),對(duì)時(shí)鐘信號(hào)設(shè)置了編譯規(guī)則,如果時(shí)鐘由于硬件設(shè)計(jì)原因分配到了普通IO上,而非_SRCC或者_(dá)MRCC專用時(shí)鐘管腳上時(shí),編譯器就會(huì)提示錯(cuò)誤。
    的頭像 發(fā)表于 04-15 11:38 ?5502次閱讀

    HighTec Tricore編譯速度優(yōu)化策略探討

    HighTec在編譯時(shí)默認(rèn)是根據(jù)工程源文件文件架構(gòu)首先生成makefile文件,然后執(zhí)行“make makefile”指令來(lái)編譯工程。
    的頭像 發(fā)表于 04-10 12:44 ?2126次閱讀
    HighTec Tricore<b class='flag-5'>編譯</b>速度優(yōu)化策略探討

    如何將預(yù)編譯靜態(tài)庫(kù)集成到PSoC? Creator中?

    BSEC API 提供了要包含的頭文件以及要鏈接的預(yù)編譯靜態(tài)庫(kù)(適用于Arm? Cortex? M4 以及 M0+)。 如何在PSoC? Creator 中執(zhí)行此操作? 謝謝
    發(fā)表于 03-06 08:07

    loop指令用法及功能

    通常分為兩種類型:條件循環(huán)和計(jì)數(shù)循環(huán)。條件循環(huán)是根據(jù)循環(huán)條件的真假來(lái)判斷是否繼續(xù)執(zhí)行循環(huán)體的代碼,而計(jì)數(shù)循環(huán)是通過設(shè)置循環(huán)變量的初始值、終止條件和每次循環(huán)后的變化規(guī)則來(lái)控制循環(huán)次數(shù)。 最常見的循環(huán)指令是for循環(huán)
    的頭像 發(fā)表于 02-14 16:12 ?2207次閱讀

    《Linux常用命令自學(xué)手冊(cè)》+Linux簡(jiǎn)單指令筆記

    當(dāng)然,我可以為您提供一些常見的Linux簡(jiǎn)單指令筆記。請(qǐng)注意,以下指令是一些常用的基礎(chǔ)指令,可能并不包含所有的Linux指令。以下是一些
    發(fā)表于 01-05 08:44