C语言#pragma使用方法
1.总结
1、#pragma用于指示编译器完成一些特定的动作
2、#pragma所定义的很多指示字是编译器特有的(每种编译可能都不一样)
(1) #pragma message 用于自定义编译信息
(2)#pragma once 用于保证头文件只被编译一次
(3)#pragama pack用于指定内存对齐(一般用在结构体)
struct占用内存大小
1)第一个成员起始于0偏移处
2)每个成员按其类型大小和pack参数中较小的一个进行对齐
——偏移地址必须能被对齐参数整除
——结构体成员的对齐参数(注意是对齐参数,而不是结构体长度)取其内部长度最大的数据成员作为其大小
3)结构体总长度必须为所有对齐参数的整数倍
编译器在默认情况下按照4字节对齐
3、#pragma在不同的编译器间是不可移植的
(1)预处理器将忽略它不认识#pragma指令
(2)不同的编译器可能以不同的方式解释同一条#pragma指令
二、代码测试
1、#pragma message:自定义编译信息输出到终端(一般和#if配合使用,用在控制版本号)
#include <stdio.h>
#define ANDROID20
#if defined ANDROID20
#pragma message "Compile Android SDK 2.0..."
#define VERSION "Android 2.0"
#elif defined ANDROID30
#pragma message "Compile Android SDK 3.0..."
#define VERSION "Android 3.0"
#elif defined ANDROID40
#pragma message "Compile Android SDK 4.0..."
#define VERSION “Android 4.0”
#else
#error Compile Version is not provided!
#endif
int main()
{
printf("%s\n",VERSION);
return 0;
}
//#include <stdio.h>
//#define ANDROID20
//#if defined ANDROID20
// #pragma message "Compile Android SDK 2.0..."
// #define VERSION "Android 2.0"
//#elif defined ANDROID30
// #pragma message "Compile Android SDK 3.0..."
// #define VERSION "Android 3.0"
//#elif defined ANDROID40
// #pragma message "Compile Android SDK 4.0..."
// #define VERSION “Android 4.0”
//#else
// #error Compile Version is not provided!
//#endif
//int main()
//{
// printf("%s\n",VERSION);
// return 0;
//}
#if 0
#include <stdio.h>
#include "test.h"
#include "test.h"
int main()
{
printf("g_value = %d\n",g_value);
return 0;
}
#endif
#include <stdio.h>
#pragma pack(2)
struct test1
{ //对齐参数 偏移地址 大小
char c1; //1 0 1
char c2; //1 1 1
short s; //2 2 2
int i; //2 4 4
};
#pragma pack()
#pragma pack(4)
struct test2
{ //对齐参数 偏移地址 大小
char c1; //1 0 1
short s; //2 2 2
char c2; //1 4 1
int i; //4 8 4
};
#pragma pack()
#pragma pack(8)
struct S1
{ //对齐参数 偏移地址 大小
short s; //2 0 2
long l; //4 4 4
};
struct S2
{ //对齐参数 偏移地址 大小
char c; //1 0 1
struct S1 d; //4 4 8
double e;//理论//8 16 8 这里实际是错误的,gcc不支持8字节对齐,所以这里默认是4字节对齐 //实际//4 12 8 所以整个占用内存是20字节
};
#pragma pack()
int main()
{
printf("sizeof(struct test1) = %d\n",sizeof(struct test1)); //输出8
printf("sizeof(struct test2) = %d\n",sizeof(struct test2)); //输出12
printf("sizeof(struct S1) = %d\n",sizeof(struct S1)); //输出8
printf("sizeof(struct S2) = %d\n",sizeof(struct S2)); //理论计算应该输出24 但是实际打印输出是20 这是因为gcc不支持8字节内存对齐,所以这里是默认4字节对齐,
return 0;
}
本文介绍了C语言中的#pragma预处理指令,包括用于自定义编译信息的#pragma message,确保头文件只被编译一次的#pragma once,以及控制结构体内存对齐的#pragma pack。通过示例代码展示了#pragma pack如何影响结构体的内存布局,并指出#pragma指令在不同编译器间的不可移植性。
1422

被折叠的 条评论
为什么被折叠?



