标签:lan 不同 计算 struct demo else int 文件 pack
#pragma
用于指示编译器完成一些特定的动作
#pragma
所定义的很多指示字是编译器独有的
#pragma
在不同的编译器间是不可移植的
#pragma
指令#pragma
指令一般用法
#pragma parameter
message 参数在大多数的编译器中都有相似的实现
message 参数在编译时输出消息到编译输出窗口
message 用于条件编译中可提示代码的版本信息
与 #error
和 #warning
不同,#pragma message
仅仅代表一条编译消息,不代表程序错误
#pragma message
使用示例
#include <stdio.h>
#if defined(ANDROID20)
#pragma message("Compile Android SDK 2.0...")
#define VERSION "Android 2.0"
#elif defined(ANDROID23)
#pragma message("Compile Android SDK 2.3...")
#define VERSION "Android 2.3"
#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;
}
//编译:gcc -DANDROID40 test.c -o test
test.c:10: note: #pragma message: Compile Android SDK 4.0...
//运行结果
Android 4.0
#pragma once
用于保证头文件只被编译一次
#pragma once
是编译器相关的,不一定被支持
#pragma once
使用示例
#include <stdio.h>
#include "global.h"
#include "global.h"
int main()
{
printf("g_value = %d\n", g_value);
return 0;
}
//global.h
#pragma once
int g_value = 1;
内存对齐
#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("sizeof(Test1) = %d\n", sizeof(struct Test1)); //12
printf("sizeof(Test2) = %d\n", sizeof(struct Test2)); //8
return 0;
}
为什么需要内存对齐?
#pragma back
用于指定内存对齐方式,能够改变编译器的默认对齐方式
strcut 占用的内存大小
第一个成员起始于 0 偏移处
每个成员按其类型大小和 pack 参数中较小的一个进行对齐
结构体总长度必须为所有对齐参数的整数倍
编译器在默认情况下按照 4 字节对齐
GCC 不支持 #pragma pack(8)
结构体大小计算
#include <stdio.h>
#pragma pack(2)
struct Test1
{ //对齐参数 偏移地址 大小
char c1; //1 0 1
short s; //2 1—>2 2
char c2; //1 4 1
int i; //2 5->6 4
};
#pragma pack()
#pragma pack(4)
struct Test2
{
char c1;
char c2;
short s;
int i;
};
#pragma pack()
int main()
{
printf("sizeof(Test1) = %d\n", sizeof(struct Test1)); //
printf("sizeof(Test2) = %d\n", sizeof(struct Test2)); //
return 0;
}
#include <stdio.h>
#pragma pack(8)
//8字节
struct S1
{ //对齐参数 偏移地址 大小
short a; //2 0 2
long b; //4 2->4 4
};
//24字节
struct S2
{ //对齐参数 偏移地址 大小
char c; //1 0 1
struct S1 d; //4 1->4 8
double e; //8 12->16 8
};
#pragma pack()
int main()
{
printf("%d\n", sizeof(struct S1));
printf("%d\n", sizeof(struct S2));
return 0;
}
标签:lan 不同 计算 struct demo else int 文件 pack
原文地址:https://www.cnblogs.com/bky-hbq/p/13646494.html