色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

3天內不再提示

淺談預編譯指令常見用法

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

很多優秀的代碼,都會借用預編譯指令來完善代碼,今天就來講講關于預編譯指令的內容。

常見的預處理指令如下:

#指令,無任何效果

#include含一個源代碼文件

#define義宏

#undef消已定義的宏

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

#ifdef果宏已經定義,則編譯下面代碼

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

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

#endif束一個if……#else件編譯塊

#error止編譯并顯示錯誤信息

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

同時有什么不妥的地方,或者遺漏了什么內容,還請留言指出。

什么是預處理指令?

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

第一種方法是用尖括號把頭文件括起來。

#include 《stdio.h》

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

第二種方法是用雙引號把頭文件括起來。

#include “test.h”

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

用#define實現求最大值和最小值的宏

#include 《stdio.h》

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

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

int main(void)

{

#ifdef MAX //判斷這個宏是否被定義

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)三元運算符要比if,else效率高

* (2)宏的使用一定要細心,需要把參數小心的用括號括起來,

* 因為宏只是簡單的文本替換,不注意,容易引起歧義錯誤。

*/

宏定義的錯誤使用

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

{

int b=3;

#ifdef SQR//只需要宏名就可以了,不需要參數,有參數的話會警告

printf(“a = %d

”,SQR(b+2));

#endif

return 0;

}

/*

*首先說明,這個宏的定義是錯誤的。并沒有實現程序中的B+2的平方

* 預處理的時候,替換成如下的結果:b+2*b+2

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

* 所以,盡量使用小括號,將參數括起來。

*/

宏參數的連接

#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;

}

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

* 第一個宏,用#把參數轉化為一個字符串

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

*/

用宏得到一個字的高位或低位的字節

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

{

return 0;

}

/*

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

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

*/

用宏定義得到一個數組所含元素的個數

#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;

}

/*

*總的大小除以每個類型的大小

*/

關于#define宏的使用,應該特別小心,尤其是含有參數計算的時候如下2示例,最保險的做法將參數用括號括起來。#ifdef,#ifndef,#endif.。。的使用以上這些預編譯指令,都是條件編譯指令,也就是說,將決定那些代碼被編譯,而哪些不被編譯。

示例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預處理指令。*/

ifdef 和 #ifndef

#include 《stdio.h》#define DEBUG

main()

{

#ifdef DEBUG

printf(“yes ”);

#endif#ifndef DEBUG

printf(“no ”);

#endif

}

//#ifdefined等價于#ifdef;//#if!defined等價于#ifndef

#else指令

#elif指令

其他一些指令

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

#line指令可以改變編譯器用來指出警告和錯誤信息的文件號和行號。

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

編輯:jq

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

    關注

    22

    文章

    2108

    瀏覽量

    73623
  • 代碼
    +關注

    關注

    30

    文章

    4779

    瀏覽量

    68525
  • 編譯器
    +關注

    關注

    1

    文章

    1623

    瀏覽量

    49108
  • 編譯
    +關注

    關注

    0

    文章

    657

    瀏覽量

    32852

原文標題:預編譯指令常見用法

文章出處:【微信號:strongerHuang,微信公眾號:strongerHuang】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    數控車床m99指令用法

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

    淺談Vivado編譯時間

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

    三菱PLC傳送指令用法

    三菱PLC(可編程邏輯控制器)在工業自動化領域中扮演著至關重要的角色。其中,傳送指令(MOV)作為PLC編程中的基礎指令之一,其正確使用對于實現數據的準確、高效傳輸至關重要。本文將詳細講解三菱PLC傳送指令(MOV)的
    的頭像 發表于 06-18 09:41 ?4090次閱讀

    PLC中SFTL指令用法

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

    數控車床m99指令用法

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

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

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

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

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

    常見的PLC通信指令有哪些呢?

    PLC的通信指令用于實現PLC與其他設備或系統之間的數據交換。
    的頭像 發表于 05-10 11:01 ?2558次閱讀

    Vivado編譯常見錯誤與關鍵警告梳理與解析

    Xilinx Vivado開發環境編譯HDL時,對時鐘信號設置了編譯規則,如果時鐘由于硬件設計原因分配到了普通IO上,而非_SRCC或者_MRCC專用時鐘管腳上時,編譯器就會提示錯誤。
    的頭像 發表于 04-15 11:38 ?5331次閱讀

    HighTec Tricore編譯速度優化策略探討

    HighTec在編譯時默認是根據工程源文件文件架構首先生成makefile文件,然后執行“make makefile”指令編譯工程。
    的頭像 發表于 04-10 12:44 ?2071次閱讀
    HighTec Tricore<b class='flag-5'>編譯</b>速度優化策略探討

    淺談制糖企業能源計量中常見的問題探討

    淺談制糖企業能源計量中常見問題探討 張穎姣 安科瑞電氣股份有限公司 上海嘉定 201801 摘要: 制糖行業因使用生產過程剩余物蔗渣為燃料,自產電力能夠滿足生產需要,無需再購買燃料和電力,因而對燃燒
    的頭像 發表于 04-09 15:29 ?347次閱讀
    <b class='flag-5'>淺談</b>制糖企業能源計量中<b class='flag-5'>常見</b>的問題探討

    如何將預編譯靜態庫集成到PSoC? Creator中?

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

    loop指令用法及功能

    通常分為兩種類型:條件循環和計數循環。條件循環是根據循環條件的真假來判斷是否繼續執行循環體的代碼,而計數循環是通過設置循環變量的初始值、終止條件和每次循環后的變化規則來控制循環次數。 最常見的循環指令是for循環
    的頭像 發表于 02-14 16:12 ?2163次閱讀

    《Linux常用命令自學手冊》+Linux簡單指令筆記

    當然,我可以為您提供一些常見的Linux簡單指令筆記。請注意,以下指令是一些常用的基礎指令,可能并不包含所有的Linux指令。以下是一些
    發表于 01-05 08:44

    三菱FX系列PLC置位與復位指令的使用教程

    有關三菱PLC置位與復位指令的功能說明,以FX2N為例,介紹其基本邏輯指令和步進指令用法,置位與復位指令(SET/RST),SET 、RS
    發表于 12-26 10:19 ?4615次閱讀
    三菱FX系列PLC置位與復位<b class='flag-5'>指令</b>的使用教程
    主站蜘蛛池模板: 8x8x我要打机飞在线观看| 年轻老师毛茸茸自由性| 入禽太深免费观看| 99热热在线精品久久| 久久亚洲伊人中字综合精品| 亚洲AV午夜福利精品香蕉麻豆| 被黑人群jian又粗又大H| 久久这里只有精品视频e| 亚洲精品免费观看| 国产在线播放不卡| 小黄鸭YELLOWDUCK7596| 国产精品久久久久影院色老大| 肉小说高h| 闺蜜扒开我尿口使劲揉| 肉多的小说腐小说| 国产成人精品久久一区二区三区 | 日本高清无人区影院| 仓井空torrent| 视频一区视频二区在线观看| 国产36d在线观看| 午夜国产高清精品一区免费| 国产婷婷午夜无码A片| 亚洲青青草| 美女18黄| 俄罗斯搜索引擎Yandex推广入口| 色噜噜视频| 好想被狂躁A片免费久99| 亚洲中文字幕AV在天堂| 噜妇插内射精品| 97se se| 亲胸吻胸添奶头GIF动态图免费 | 在线观看中文字幕码2021不用下载| 麻豆精品一卡2卡三卡4卡免费观看| 99视频免费在线观看| 午夜福利试看120秒体验区| 黄子佼81岁父亲现状曝光| 99国产小视频| 无码免费视频AAAAAA片草莓| 久久嫩草影院网站| 嘟嘟嘟WWW免费高清在线中文| 一个人在线观看免费中文www|