亚洲精品久久久久久久久久久,亚洲国产精品一区二区制服,亚洲精品午夜精品,国产成人精品综合在线观看,最近2019中文字幕一页二页

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

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

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

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

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

掃碼添加小助手

加入工程師交流群

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

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

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

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

#define義宏

#undef消已定義的宏

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

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

#ifndef果宏沒(méi)有定義,則編譯下面代碼

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

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

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

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

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

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

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

第一種方法是用尖括號(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ù)處理過(guò)程會(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;

}

/*

*首先說(shuō)明,這個(gè)宏的定義是錯(cuò)誤的。并沒(méi)有實(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è)類(lèi)型的大小

*/

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

示例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令沒(méi)有正式的定義。編譯器可以自定義其用途。典型的用法是禁止或允許某些煩人的警告信息。

編輯:jq

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

    關(guān)注

    22

    文章

    2120

    瀏覽量

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

    關(guān)注

    30

    文章

    4930

    瀏覽量

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

    關(guān)注

    1

    文章

    1666

    瀏覽量

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

    關(guān)注

    0

    文章

    682

    瀏覽量

    34885

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

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

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

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

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

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

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

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

    想請(qǐng)問(wèn)若關(guān)閉RT-Thread nano的中斷,并不進(jìn)行中斷管理操作,是不是就不會(huì)編譯產(chǎn)生csr指令? 或者說(shuō),是否有辦法可以阻止RT-Thread nano編譯后產(chǎn)生csr指令?因?yàn)?/div>
    發(fā)表于 09-09 08:16

    步進(jìn)電機(jī)控制指令詳解

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

    在 PCB 組裝之前,是否可以使用獨(dú)立編程器對(duì) CYPD6125-40LQXI 進(jìn)行預(yù)編程?

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

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

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

    harmony OS NEXT-Navagation基本用法

    # Navagation基本用法 > Navigation組件是路由導(dǎo)航的根視圖容器,一般作為Page頁(yè)面的根容器使用,其內(nèi)部默認(rèn)包含了標(biāo)題欄,內(nèi)容欄和公工具欄,其中內(nèi)容區(qū)默認(rèn)首頁(yè)顯示導(dǎo)航內(nèi)容
    的頭像 發(fā)表于 04-27 17:39 ?588次閱讀

    淺談壓力變送器的常見(jiàn)故障及解決措施

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

    淺談電磁流量計(jì)的常見(jiàn)故障及排除方法

    電磁流量計(jì)作為常用的流量測(cè)量?jī)x表,在使用過(guò)程中可能會(huì)遇到各種故障。以下是對(duì)電磁流量計(jì)常見(jiàn)故障及排除方法的淺談: 一、儀表顯示最小或無(wú)顯示 當(dāng)電磁流量計(jì)顯示最小或無(wú)顯示時(shí),通常意味著傳感器沒(méi)有流量信號(hào)
    的頭像 發(fā)表于 04-20 17:56 ?1071次閱讀

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

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

    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 ?1592次閱讀

    Triton編譯器的常見(jiàn)問(wèn)題解決方案

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

    Triton編譯器與其他編譯器的比較

    Triton編譯器與其他編譯器的比較主要體現(xiàn)在以下幾個(gè)方面: 一、定位與目標(biāo) Triton編譯器 : 定位:專(zhuān)注于深度學(xué)習(xí)中最核心、最耗時(shí)的張量運(yùn)算的優(yōu)化。 目標(biāo):提供一個(gè)高度抽象、靈活、高效
    的頭像 發(fā)表于 12-24 17:25 ?1452次閱讀

    Triton編譯器功能介紹 Triton編譯器使用教程

    Triton 是一個(gè)開(kāi)源的編譯器前端,它支持多種編程語(yǔ)言,包括 C、C++、Fortran 和 Ada。Triton 旨在提供一個(gè)可擴(kuò)展和可定制的編譯器框架,允許開(kāi)發(fā)者添加新的編程語(yǔ)言特性和優(yōu)化技術(shù)
    的頭像 發(fā)表于 12-24 17:23 ?2412次閱讀

    soc開(kāi)發(fā)流程常見(jiàn)問(wèn)題及解決方案

    ,導(dǎo)致編譯或運(yùn)行失敗。 解決方案 : 提供詳細(xì)的開(kāi)發(fā)環(huán)境搭建指南,包括所需軟件、版本要求及安裝步驟。 使用虛擬環(huán)境(如Python的venv或conda)來(lái)隔離項(xiàng)目依賴項(xiàng),避免與其他項(xiàng)目沖突。 定期檢查并更新依賴項(xiàng)列表,確保版本兼容性。 二、編譯問(wèn)題
    的頭像 發(fā)表于 11-10 09:26 ?1980次閱讀