加入星計(jì)劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴(kuò)散
  • 作品版權(quán)保護(hù)
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長(zhǎng)期合作伙伴
立即加入
  • 正文
  • 推薦器件
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

#error, #line, #pragma這幾個(gè)宏定義你經(jīng)常用嗎?

02/18 15:40
5497
閱讀需 8 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

#error 和 #warning

#error 是預(yù)編譯器中的一個(gè)指示宏,用于生成一個(gè)編譯錯(cuò)誤的消息,也可以用于給自己做提示,比如有些宏的定義和值是否符合預(yù)期,可以通過(guò)#if等判斷語(yǔ)句來(lái)輸出編譯錯(cuò)誤信息提示自己。同樣的#warning也一樣可以起到提示作用,但#warning不會(huì)使編譯器停止編譯。用法:

#error    message#warning  message

#line

line?用于強(qiáng)制制定新的行號(hào)和編譯文件名,并對(duì)源程序的代碼重新進(jìn)行編號(hào)

使用方法:

#line  number  newfilename

也可以:

line?number??//只定義行號(hào)

line本質(zhì)是重新定義 _LINE_ 和 _FILE_ 兩個(gè)編譯參數(shù),在錯(cuò)誤打印和調(diào)試方面非常有用。

舉個(gè)例子:

#include <stdio.h>//作者 A 寫(xiě)的代碼 //------------開(kāi)始-------------------------- //把 line 的下一行定義為第 1 行,文件名為“a.c”#line 1 "a.c"//------------結(jié)束--------------------------

?

//作者 B 寫(xiě)的代碼 //------------開(kāi)始-------------------------- //把 line 的下一行定義為第 1 行,文件名為“b.c”#line 1 "b.c"//------------結(jié)束--------------------------

?

//作者 C 寫(xiě)的代碼 //-----------------開(kāi)始--------------------------#line 1 "MyCode.c"int main(){    printf("%s:%dn",__FILE__,__LINE__);//輸出 MyCode.c:4#line 1 "Test.c"     printf("%s:%dn",__FILE__,__LINE__);//輸出 Test.c:2    return 0;} //-----------------結(jié)束--------------------------

#pragma

pragma 用于指示編譯器完成一些特定的動(dòng)作。

pragma 所定義的很多命令字是編譯器特有的,在不同的編譯器間是不可移植的。

預(yù)處理器將忽略它不認(rèn)識(shí)的#pragma?指令不同編譯器可能以不同的方式解釋同一條#pragma?指令

一般用法:

#pragma?parameter?//注意,不同的?parameter?參數(shù)語(yǔ)法和意義不同
    message?參數(shù)在大多數(shù)的編譯器中都有相似的實(shí)現(xiàn)message?參數(shù)在編譯時(shí)輸出消息到編譯輸出窗口中message?用于條件編譯可提示代碼的版本信息

與#error 和#warning 不同,#pragma message 僅僅代表一條編譯消息,不代表程序錯(cuò)誤。

#pragma once

pragma once?用于保證頭文件只被編譯一次

pragma once是編譯器相關(guān)的,不一定被支持(vcgcc 都支持,bcc 不支持?。?/p>

#pragma once?比#ifndef…#define…#endif 效率高,因?yàn)楹笳叨x的頭文件仍然被處理。前者只要頭文件被定義一次,就不會(huì)再次被處理。

#pragma once //說(shuō)明:因#pragma once 不被所有的編譯器支持(如 bcc 不支持),但              //#pragma once 又比#ifndef...#define...#endif 效率高,如果              //為了讓支持#pragma once 的編譯器有更高的效率有更高的效率,             //可以采用如下的頭文件定義方式
#pragma once //當(dāng)編譯器不支持#pragma once 時(shí),會(huì)直接忽略這行 #ifndef?_HEADER_FILE_H_?#define?_HEADER_FILE_H_//source code#endif

#pragma?pack

用于指定內(nèi)存對(duì)齊方式

#pragma pack(1)按一字節(jié)對(duì)齊,通常被使用在一些靠指針和結(jié)構(gòu)體解析命令和數(shù)據(jù)的場(chǎng)合。

#include <stdio.h>#pragma pack(2)struct Test1{     char c1; //對(duì)齊參數(shù):min(1,2)=1, offset = 0      short s; //對(duì)齊參數(shù):min(2,2)=2, offset = 2    char c2; //對(duì)齊參數(shù):min(1,2)=1, offset = 4    int i;   //對(duì)齊參數(shù):min(4,2)=2, offset = 6}; #pragma pack()

?

#pragma pack(4)struct Test2{     char c1; //對(duì)齊參數(shù):min(1,4)=1, offset = 0    char c2; //對(duì)齊參數(shù):min(1,4)=1, offset = 1    short s; //對(duì)齊參數(shù):min(2,4)=2, offset = 2    int i;   //對(duì)齊參數(shù):min(4,4)=4, offset = 4}; #pragma pack()

?

int main(){    printf("sizeof(Test1) = %dn",sizeof(struct Test1)); //10    printf("sizeof(Test2) = %dn",sizeof(struct Test2)); //8    return 0;}

為什么要做字節(jié)對(duì)齊呢?

推薦器件

更多器件
器件型號(hào) 數(shù)量 器件廠商 器件描述 數(shù)據(jù)手冊(cè) ECAD模型 風(fēng)險(xiǎn)等級(jí) 參考價(jià)格 更多信息
0533980671 1 Molex Board Connector, 6 Contact(s), 1 Row(s), Male, Straight, Surface Mount Terminal, ROHS AND REACH COMPLIANT

ECAD模型

下載ECAD模型
$1.89 查看
B82494-G1104-K 1 TDK Corporation General Purpose Inductor, 100uH, 10%, 1 Element, Ferrite-Core, SMD, 1008,
暫無(wú)數(shù)據(jù) 查看
IPP65R190CFDXKSA1 1 Infineon Technologies AG Power Field-Effect Transistor, 17.5A I(D), 650V, 0.19ohm, 1-Element, N-Channel, Silicon, Metal-oxide Semiconductor FET, TO-220AB, GREEN, PLASTIC, TO-220, 3 PIN
$5.96 查看

相關(guān)推薦

電子產(chǎn)業(yè)圖譜

多年硬件從業(yè)經(jīng)驗(yàn),專注分享從研發(fā)到供應(yīng)鏈,再到精益制造過(guò)程中的經(jīng)驗(yàn)和感悟!