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

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

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

2024/02/18
5691
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

#error 和 #warning

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

#error    message#warning  message

#line

line?用于強制制定新的行號和編譯文件名,并對源程序的代碼重新進行編號

使用方法:

#line  number  newfilename

也可以:

line?number??//只定義行號

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

舉個例子:

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

?

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

?

//作者 C 寫的代碼 //-----------------開始--------------------------#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 用于指示編譯器完成一些特定的動作。

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

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

一般用法:

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

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

#pragma once

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

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

#pragma once?比#ifndef…#define…#endif 效率高,因為后者定義的頭文件仍然被處理。前者只要頭文件被定義一次,就不會再次被處理。

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

#pragma?pack

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

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

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

?

#pragma pack(4)struct Test2{     char c1; //對齊參數(shù):min(1,4)=1, offset = 0    char c2; //對齊參數(shù):min(1,4)=1, offset = 1    short s; //對齊參數(shù):min(2,4)=2, offset = 2    int i;   //對齊參數(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é)對齊呢?

推薦器件

更多器件
器件型號 數(shù)量 器件廠商 器件描述 數(shù)據(jù)手冊 ECAD模型 風險等級 參考價格 更多信息
53047-0310 1 Molex Board Connector, 3 Contact(s), 1 Row(s), Male, Straight, 0.049 inch Pitch, Solder Terminal, Locking, White Insulator, Receptacle,

ECAD模型

下載ECAD模型
$0.15 查看
5004 1 API Technologies Corp RF Connector Adapter, 1.85MM-1.85MM, Male-Male, ROHS COMPLIANT
$7.19 查看
47386 1 TE Connectivity CERTI-CRIMP PIDG 22-16 DAHT
$918.33 查看

相關(guān)推薦

登錄即可解鎖
  • 海量技術(shù)文章
  • 設(shè)計資源下載
  • 產(chǎn)業(yè)鏈客戶資源
  • 寫文章/發(fā)需求
立即登錄