一、介绍
#pragma 是一个很强大的预处理指令
二、用法
用法格式: #pragma 参数
常用参数:
1、once
2、pack
3、message
4、alloc_text
5、comment
6、optimize
7、auto_inline
8、component
9、inline_depth
10、init_seg*
11、bss_seg
12、data_seg
13、code_seg
14、const_seg
15、check_stack
16、inline_recursion
17、pointers_to_members*
18、function
19、intrinsic
20、setlocale
21、hdrstop
22、vtordisp*
23、include_alias
24、warning
三、示例
1、#progma once指定该文件在编译源代码文件时仅由编译器包含(打开)一次
#pragma once
#ifndef _HELLO_H_
#define _HELLO_H_
//代码声明
#endif
2、#pragma pack指定内存对齐方式
对齐方式必须是2的幂次方,即1、2、4、8、16等
- #pragma pack(show) 以警告信息的形式显示当前字节对齐的值.
- #pragma pack(n) 将当前字节对齐值设为 n .
- #pragma pack() 将当前字节对齐值设为默认值(通常是8) .
- #pragma pack(push) 将当前字节对齐值压入编译栈栈顶.
- #pragma pack(pop) 将编译栈栈顶的字节对齐值弹出并设为当前值.
- #pragma pack(push, n) 先将当前字节对齐值压入编译栈栈顶, 然后再将 n 设为当前值.
- #pragma pack(pop, n) 将编译栈栈顶的字节对齐值弹出, 然后丢弃, 再将 n 设为当前值.
- #pragma pack(push, identifier) 将当前字节对齐值压入编译栈栈顶, 然后将栈中保存该值的位置标识为 identifier .
- #pragma pack(pop, identifier) 将编译栈栈中标识为 identifier 位置的值弹出, 并将其设为当前值. 注意, 如果栈中所标识的位置之上还有值, 那会先被弹出并丢弃.
- #pragma pack(push, identifier, n) 将当前字节对齐值压入编译栈栈顶, 然后将栈中保存该值的位置标识为 identifier, 再将 n 设为当前值.
- #pragma pack(pop, identifier, n) 将编译栈栈中标识为 identifier 位置的值弹出, 然后丢弃, 再将 n 设为当前值. 注意, 如果栈中所标识的位置之上还有值, 那会先被弹出并丢弃.
例如下:2字节对齐
#pragma pack(2)
struct Test1
{
char c1;
char c2;
int i;
};
#pragma pack()
不对其的时候,也可以写成这样
struct student
{
char name[7];
uint32_t id;
char subject[5];
} __attribute__ ((packed));
结构体默认在windows上是4字节对齐
因为设置2字节对齐,c1 1字节 c2 1字节 i4字节 一共6字节
默认4字节的话
struct Test1
{
char c1;
char c2;
int i;
};
c1 1字节 c2 1字节 i 4字节 c1 + c2一共2字节不足4字节,所以会补齐2字节一共4+4=8字节
字节对齐的好处是cpu访问速度更快,当设置不对其的话会访问多次才能取完值
字节不对其的好处是方便计算长度,特别是协议的处理或者协议栈的设计中会经常不对其
3、#pragma message自定义打印编译信息
示例1:
#define EN 1
#if EN == 1
#pragma message("EN ==1")
#endif
示例2:
#pragma message( "Compiling " __FILE__ ) //显示被编译的文件
#pragma message( "Last modified on " __TIMESTAMP__ ) //文件最后一次修改的日期和时间
示例3:
#define STRING2(x) #x
#define STRING(x) STRING2(x)
#pragma message (__FILE__ "[" STRING(__LINE__) "]: test") //注意把行号转成了字符串
预留剩下的