#error 生成一个变异错误信息,可用于提示编译条件是否满足。
用法
#error message
注:message不需要双引号括起来
#pragma用于指示编译器完成一些特定的动作,并且不同的编译器之间不可进行移植。
#pragma的用法:
#pragma parameter
注:不同的parameter参数语法和意义不同。
下面,让我们来看看#error以及#pragma具体的使用
#include<stdio.h>
void f(){
#if (DOG == 1)
#else
#pragma message("good")
#error please input DOG
#endif
}
int main(){
f();
return 0;
}
[lin@bogon C]$ gcc 24_class.c
24_class.c: In function ‘f’:
24_class.c:7: note: #pragma message: good
24_class.c:8:3: error: #error please input DOG
以上就是程序的输出结果。
#pragma还有一个用法,就是调整内存的对齐方式。让我们先来看一段程序。
#include<stdio.h>
struct test1{
char c1;
short s;
char c2;
int i;
};
struct test2{
char c1;
char c2;
short s;
int i;
};
int main(){
printf("%d\n", sizeof(struct test1));
printf("%d\n", sizeof(struct test2));
return 0;
}
我们可以自己先算一下,看程序输出的值是多少。
这里,首先要说一下怎么计算struct所占用的内存大小:
- 第一个成员起始为0的偏移量
- 每个成员按其类型大小以及pack参数(默认情况下取值为4)中较小的作为其大小,且偏移地址必须被对齐数整除,结构体成员取其内部长度最大的数据成员作为其大小。
- 总长度必须为对齐参数的整数倍
这样说起来很绕,不如直接计算一下就知道了
struct test1{ //对齐参数 偏移大小 大小
char c1; // 1 0 1
short s; // 2 2 2
char c2; // 1 4 1
int i; // 4 8 4
};
这样子计算出来的答案就是8+4=12。同样的道理,就能的出struct test2所占据的内存大小为8。那么,怎么设置对齐参数呢。下面,我们在看看一下的程序代码。
#include<stdio.h>
#pragma pack(1)
struct test1{
char c1;
short s;
char c2;
int i;
};
struct test2{
char c1;
char c2;
short s;
int i;
};
#pragma pack()
int main(){
printf("%d\n", sizeof(struct test1));
printf("%d\n", sizeof(struct test2));
return 0;
}
通过#pragma pack()就能对对齐参数进行调整,这样子两个结构体的内存大小就完全相同了