国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

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

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

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

淺談預編譯指令常見用法

strongerHuang ? 來源:小麥大叔 ? 作者:小麥大叔 ? 2021-06-23 17:30 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

常見的預處理指令如下:

#指令,無任何效果

#include含一個源代碼文件

#define義宏

#undef消已定義的宏

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

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

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

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

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

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

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

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

什么是預處理指令?

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

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

#include 《stdio.h》

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

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

#include “test.h”

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

用#define實現(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 //判斷這個宏是否被定義

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)宏的使用一定要細心,需要把參數(shù)小心的用括號括起來,

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

*/

宏定義的錯誤使用

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

{

int b=3;

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

printf(“a = %d

”,SQR(b+2));

#endif

return 0;

}

/*

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

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

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

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

*/

宏參數(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ù)是使用不到這些的,使用到的話,查看手冊就可以了)

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

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

*/

用宏得到一個字的高位或低位的字節(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;

}

/*

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

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

*/

用宏定義得到一個數(shù)組所含元素的個數(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;

}

/*

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

*/

關(guān)于#define宏的使用,應該特別小心,尤其是含有參數(shù)計算的時候如下2示例,最保險的做法將參數(shù)用括號括起來。#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

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

    關(guān)注

    22

    文章

    2124

    瀏覽量

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

    關(guān)注

    30

    文章

    4968

    瀏覽量

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

    關(guān)注

    1

    文章

    1672

    瀏覽量

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

    關(guān)注

    0

    文章

    694

    瀏覽量

    35158

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

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

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    簡單高效的鴻蒙編譯提速技巧

    在鴻蒙應用開發(fā)中編譯構(gòu)建是開發(fā)者最頻繁的操作,每一次編譯提速都能顯著提升項目整體開發(fā)效率。本次分享幾個簡單卻高效的鴻蒙編譯提速技巧,從編譯配置、構(gòu)建方式等維度進行優(yōu)化,讓你的開發(fā)流程更
    的頭像 發(fā)表于 03-04 16:09 ?33次閱讀
    簡單高效的鴻蒙<b class='flag-5'>編譯</b>提速技巧

    三菱PLC特殊輔助繼電器指令功能用法教程

    ?三菱PLC的M8000指令大全?包括了一系列特殊功能寄存器,這些寄存器在PLC的運行中起著重要的作用。
    的頭像 發(fā)表于 01-23 16:22 ?485次閱讀
    三菱PLC特殊輔助繼電器<b class='flag-5'>指令</b>功能<b class='flag-5'>用法</b>教程

    RISC-V高級指令融合如何實現(xiàn)性能密度躍升

    Synopsys ARC-V 處理器中的高級指令融合引入了一種新型機制,用于融合常見的 RISC-V 指令對,旨在提高處理器流水線效率,特別是針對資源受限的嵌入式處理器。通過融合來自不同功能單元的
    的頭像 發(fā)表于 12-29 11:22 ?316次閱讀
    RISC-V高級<b class='flag-5'>指令</b>融合如何實現(xiàn)性能密度躍升

    #define預編譯指令

    #define預編譯指令 顧名思義,這個指令的含義是“定義”,大家可以把該指令視為一種文本的替換。詳細在下面代碼展示 [list=1] [*]//使用該
    發(fā)表于 12-05 07:29

    #include預編譯指令

    ?那就要從編譯器眼中的#include指令說起。 長話短說,大家可以把#include“xxx.h”看成是文本的展開,簡而言之就是通過該指令把h文件里的內(nèi)容進行了展開。如下范例所示,我們定義一個H文件
    發(fā)表于 12-04 07:43

    使用Vivado 2018.2編譯E203的mcs文件,遇到的問題求解

    Hi 各位,我在嘗試使用Vivado 2018.2編譯E203的mcs文件,遇到如下兩個問題: 1. 按照書中步驟運行,執(zhí)行完make mcs之后得到的mcs文件與git中預編譯出來的mcs文件有
    發(fā)表于 11-11 06:04

    請問蜂鳥自帶編譯工具怎么才能不使用壓縮指令呢?

    請問,benchmark里編譯選項應該如何設置才能把壓縮指令去掉,保留完整的32位指令呢?我嘗試修改編譯選項,將-march=rv32imafdc修改為-march=rv32imafd
    發(fā)表于 11-07 07:52

    通過內(nèi)聯(lián)匯編調(diào)用乘法指令mulh\\mulhsu\\mulhu

    高32位 mulhsurd, rs1,rs2 將rs1當作有符號數(shù),rs2當作無符號數(shù)相乘,取高32位 2.由于C語言中的乘法符號,在經(jīng)過軟件編譯后生成的匯編指令位mul指令,因此,想要驗證
    發(fā)表于 10-24 06:52

    env工具顯示指令不是內(nèi)部指令是怎么回事?

    Rt-thread studio軟件能正常使用,為什么官網(wǎng)下載Env軟件打開Bsp路徑下對程序進行編譯顯示不是內(nèi)部指令.
    發(fā)表于 10-10 07:55

    請問若關(guān)閉RT-Thread nano的中斷,并不進行中斷管理操作,是不是就不會編譯產(chǎn)生csr指令

    想請問若關(guān)閉RT-Thread nano的中斷,并不進行中斷管理操作,是不是就不會編譯產(chǎn)生csr指令? 或者說,是否有辦法可以阻止RT-Thread nano編譯后產(chǎn)生csr指令?因為
    發(fā)表于 09-09 08:16

    步進電機控制指令詳解

    這些指令主要是針對用 PLC 直接聯(lián)動伺服放大器,目的是可以不借助其他擴展設備(例如1GM 模塊)來進行簡單的點位控制, 使用這些指令時最好配合三菱的伺服放大器 (如 MR-J2)。然而,我們也可以用這些指令來控制步進電機的運行
    的頭像 發(fā)表于 06-12 10:33 ?1985次閱讀
    步進電機控制<b class='flag-5'>指令</b>詳解

    在 PCB 組裝之前,是否可以使用獨立編程器對 CYPD6125-40LQXI 進行預編程?

    在 PCB 組裝之前,是否可以使用獨立編程器對 CYPD6125-40LQXI 進行預編程?
    發(fā)表于 05-23 07:47

    飛凌嵌入式ElfBoard ELF 1板卡-uboot編譯原理介紹

    編譯工具將源碼文件編譯成可執(zhí)行文件的過程并不是一步到位的,其中要經(jīng)過一個類似工廠流水線的過程,交叉編譯工具中包含負責處理各個環(huán)節(jié)的功能工具,所以叫做交叉編譯工具鏈。
    發(fā)表于 05-22 11:17

    淺談壓力變送器的常見故障及解決措施

    壓力變送器在工業(yè)自動化領域中扮演著至關(guān)重要的角色,然而,由于其工作環(huán)境的復雜性和多樣性,故障時有發(fā)生。以下是對壓力變送器常見故障及解決措施的淺談: 一、變送器無輸出 ● 常見故障現(xiàn)象: 變送器在接通
    的頭像 發(fā)表于 04-23 17:18 ?2411次閱讀

    淺談電磁流量計的常見故障及排除方法

    電磁流量計作為常用的流量測量儀表,在使用過程中可能會遇到各種故障。以下是對電磁流量計常見故障及排除方法的淺談: 一、儀表顯示最小或無顯示 當電磁流量計顯示最小或無顯示時,通常意味著傳感器沒有流量信號
    的頭像 發(fā)表于 04-20 17:56 ?1969次閱讀