#pragma使用分析
#pragma简介(1)#pragma用于指示编译器完成一些特定的动作(2)#pragma所定义的很多指示字是编译器特有的(3)#pragma在不同的编译器间不可移植预处理器将忽略它不认识的#pragma指令不同的编译器可能以不同的方式解释同一条#pragma指令一般用法:#pragma parameter注意:不同的parameter参数语法和意义各不相同#if defined(ANDROID2
#pragma简介
(1)#pragma用于指示编译器完成一些特定的动作
(2)#pragma所定义的很多指示字是编译器特有的
(3)#pragma在不同的编译器间不可移植
预处理器将忽略它不认识的#pragma指令
不同的编译器可能以不同的方式解释同一条#pragma指令
一般用法:
#pragma parameter
注意:不同的parameter参数语法和意义各不相同
#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
#pragma once用于保证头文件只被编译一次
#pragma once是编译器相关的,不一定被支持
#ifndef FILE_H
#define FILE_H
#endif
与
#pragma once
区别:
#pragma once:告诉预处理器当前文件只处理一次,保证头文件只被只编译一次,效率高
#ifndef FILE_H
#define FILE_H
#endif:包含了多次头文件,通过宏的方式保证只能嵌入一次,但预处理器还是处理了多次,从效率上说,效率低
**结合使用方法:**保证了编译效率,也保证了一次性
#ifndef _GLOBAL_H_
#define _GLOBAL_H_
#pragma once
int g_val = 1;
#endif
#pragma pack:指定内存对齐
#pragma pack()能够改变编译器的默认对齐方式
struct占用的内存大小
(1)第一个成员起始于0偏移处
(2)每一个成员按其类型大小和pack参数中较小的一个进行对齐
偏移地址必须能被对齐参数整除
结构体成员的参数大小取其内部长度最大的数据成员作为其大小
(3)结构体总长度必须为所有对齐参数的整数倍
编译器在默认情况下按照4字节对齐
#include <stdio.h>
#pragma pack(8)
struct S1
{ //对齐参数 偏移地址 大小
short a; //2 0 2
long b; //4 4 4
};
struct S2
{
char c; //1 0 1
struct S1 d; //4 4 8
double e; //8 16 8
//gcc不支持8字节对齐 4 12 8
};
//结构体成员的参数大小取其内部长度最大的数据成员作为其大小
//偏移地址必须能被对齐参数整除
//gcc编译器不支持8字节对齐
#pragma pack()
int main()
{
printf("%d\n", sizeof(struct S1));
printf("%d\n", sizeof(struct S2));
return 0;
}
#pragma pack(1)
struct Test1
{
char c1;
short s;
char c2;
int i;
};
#pragma pack(1)
struct Test2
{
char c1;
char c2;
short s;
int i;
};
sizeof(struct Test1) = 8;
sizeof(struct Test1) = 8;
gcc编译器不支持8字节对齐
更多推荐
所有评论(0)