C语言进阶课程学习记录-第24课 - #pragma 使用分析
- #pragma
- 实验-#pragma message
- cmd窗口运行
 
- 实验-pragma once
- bcc编译报错
- gcc编译成功
- global.h代码优化
 
- #pragma pack
- 实验
- BCC编译器输出
 
- 小结
 
本文学习自狄泰软件学院 唐佐林老师的 C语言进阶课程,图片全部来源于课程PPT,仅用于个人学习记录
#pragma

 
实验-#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!
#endifint main()
{printf("%s\n", VERSION);return 0;
}
cmd窗口运行
D:\Users\cy\Cxuexi\gccLearn\24-1>gcc 24-1.c
24-1.c:13:6: error: #error Compile Version is not provided!#error Compile Version is not provided!^~~~~
24-1.c: In function 'main':
24-1.c:18:20: error: 'VERSION' undeclared (first use in this function)printf("%s\n", VERSION);^~~~~~~
24-1.c:18:20: note: each undeclared identifier is reported only once for each function it appears inD:\Users\cy\Cxuexi\gccLearn\24-1>gcc -DANDROID20 24-1.c
24-1.c:4:13: note: #pragma message: Compile Android SDK 2.0...#pragma message("Compile Android SDK 2.0...")^~~~~~~D:\Users\cy\Cxuexi\gccLearn\24-1>gcc -DANDROID23 24-1.c
24-1.c:7:13: note: #pragma message: Compile Android SDK 2.3...#pragma message("Compile Android SDK 2.3...")^~~~~~~D:\Users\cyz1994\Cxuexi\gccLearn\24-1>a.exe
Android 2.3

实验-pragma once
//global.h
#pragma once//不是所有编译器都支持此命令int g_value = 1;
#include <stdio.h>
#include "global.h"
#include "global.h"int main()
{printf("g_value = %d\n", g_value);return 0;
}
bcc编译报错

gcc编译成功
D:\Users\cy\Cxuexi\gccLearn\test>gcc test.cD:\Users\cy\Cxuexi\gccLearn\test>a.exe
g_value = 1
global.h代码优化
//global.h
#ifndef _GLOBAL_H_//防止编译器不支持,添加条件编译
#def _GLOBAL_H_
#pragma once//int g_value = 1;
#endif
#pragma pack

 
 
 
 
#pragma pack(4)
struct Test1
{				//对齐参数  偏移地址 大小char  c1;	//1        0		1short s;	//2        2		2char  c2;	//1        4		1int   i;	//4        8		4
};
#pragma pack()
对齐参数 =min(pack内部数字,数据类型字节数)
 偏移地址必须是对齐参数的整数倍
 大小=数据类型字节数
实验
#include <stdio.h>#pragma pack(2)
struct Test1
{             //对齐参数  偏移地址 大小char  c1;   //1        0		1short s;    //2      2     2char  c2;   //1     4      1int   i;    //2     6      4
};
#pragma pack()#pragma pack(4)
struct Test2
{				//对齐参数  偏移地址 大小char  c1;	//1        0		1char  c2;	//1        1		1short s;	//2        2		2int   i;	//4        4		4
};
#pragma pack()int main()
{printf("sizeof(Test1) = %d\n", sizeof(struct Test1));printf("sizeof(Test2) = %d\n", sizeof(struct Test2));return 0;
}/*
output:
sizeof(Test1) = 10
sizeof(Test2) = 8*/
#include <stdio.h>#pragma pack(8)//有些编译器不支持,采取默认字节对齐struct S1
{			//对齐参数  偏移地址 大小short a;//2     0       2long b;	//4     4       4
};struct S2
{char c; 	//1		0	1struct S1 d;// 8    8    8double e;   //8     16   8
};#pragma pack()int main()
{printf("%d\n", sizeof(struct S1));printf("%d\n", sizeof(struct S2));return 0;
}
/*output:
8
24
*/
BCC编译器输出

小结
#pragma用于指示编译器完成一些特定的动作
#pragma所定义的很多指示字是编译器特有的
- #pragma message用于自定义编译消息
- #pragma once用于保证头文件只被编译一次
- #pragma pack用于指定内存对齐方式