1.#error
//main.cpp
#include<stdio.h>
#error 数组未分配空间!
int main()
{
int a[];
return 0;
}
编译器会生成如下错误信息:
main.cpp(4): fatal error C1189: #error : 数组未分配空间!
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========
通过#error指令我们可以自定义错误信息。(我感觉这个用处不大)
2.#line
#line用来修改__LINE__和__FILE__的值。
#include<stdio.h>
//#line 100 "m.c"
int main()
{
printf("%s\n",__FILE__);
printf("%d\n",__LINE__);
printf("%d\n",__LINE__);
return 0;
}
#line的指令格式如下:
#line number "filename"
number是当前行号,filename是当前的文件名。
上面的程序会输出:
d:\用户目录\documents\visual studio 2010\projects\preprocessor\preprocessor\main.cpp
6
7
如果把//#line 100 "m.c"的注释去掉,运行结果就变成了:
d:\用户目录\documents\visual studio 2010\projects\preprocessor\preprocessor\m.c
103
104
这就达到了,在预编译中修改行号和文件名字的目的。
3.#pragma
这条指令受编译器限制。
不同编译器对其解释不同。
下面是一个简单的应用。
#include<stdio.h>
#pragma pack(1)
struct Data
{
char a;
int b;
char c;
};
int main()
{
printf("%d\n",sizeof(struct Data));
return 0;
}
上面的程序用来设置结构体中变量方式,
语法:#pragma pack(n) 设置变量以n字节对齐方式
如果不添加#pragma pack(1)这条语句的话,struct Data会按默认对齐方式以12字节存储。
添加之后,struct Data会按照一个字节的方式对齐,则以6个字节存储。1(char)+4(int)+1(char)=6