#error 和 #warning
#error
是预编译器中的一个指示宏,用于生成一个编译错误的消息,也可以用于给自己做提示,比如有些宏的定义和值是否符合预期,可以通过#if等判断语句来输出编译错误信息提示自己。同样的#warning
也一样可以起到提示作用,但#warning
不会使编译器停止编译。用法:
#error message
#warning message
#line
line 用于强制制定新的行号和编译文件名,并对源程序的代码重新进行编号
使用方法:
#line number newfilename
也可以:
line number //只定义行号
line本质是重新定义 _LINE_ 和 _FILE_ 两个编译参数,在错误打印和调试方面非常有用。
举个例子:
#include <stdio.h>
//作者 A 写的代码
//------------开始--------------------------
//把 line 的下一行定义为第 1 行,文件名为“a.c”
#line 1 "a.c"
//------------结束--------------------------
//作者 B 写的代码
//------------开始--------------------------
//把 line 的下一行定义为第 1 行,文件名为“b.c”
#line 1 "b.c"
//------------结束--------------------------
//作者 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;
}
//-----------------结束--------------------------
#pragma
pragma 用于指示编译器完成一些特定的动作。
pragma 所定义的很多命令字是编译器特有的,在不同的编译器间是不可移植的。
预处理器将忽略它不认识的#pragma 指令不同编译器可能以不同的方式解释同一条#pragma 指令
一般用法:
#pragma parameter //注意,不同的 parameter 参数语法和意义不同
- message 参数在大多数的编译器中都有相似的实现message 参数在编译时输出消息到编译输出窗口中message 用于条件编译可提示代码的版本信息
与#error 和#warning 不同,#pragma message 仅仅代表一条编译消息,不代表程序错误。
#pragma once
pragma once 用于保证头文件只被编译一次
pragma once是编译器相关的,不一定被支持(vcgcc 都支持,bcc 不支持!)
#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
用于指定内存对齐方式
#pragma pack(1)
按一字节对齐,通常被使用在一些靠指针和结构体解析命令和数据的场合。
#include <stdio.h>
#pragma pack(2)
struct Test1
{
char c1; //对齐参数:min(1,2)=1, offset = 0
short s; //对齐参数:min(2,2)=2, offset = 2
char c2; //对齐参数:min(1,2)=1, offset = 4
int i; //对齐参数:min(4,2)=2, offset = 6
};
#pragma pack()
#pragma pack(4)
struct Test2
{
char c1; //对齐参数:min(1,4)=1, offset = 0
char c2; //对齐参数:min(1,4)=1, offset = 1
short s; //对齐参数:min(2,4)=2, offset = 2
int i; //对齐参数: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;
}
为什么要做字节对齐呢?