#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ì)齊呢?