C语言预处理指令实列二#pragma

一、介绍
#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等

  1. #pragma pack(show) 以警告信息的形式显示当前字节对齐的值.
  2. #pragma pack(n) 将当前字节对齐值设为 n .
  3. #pragma pack() 将当前字节对齐值设为默认值(通常是8) .
  4. #pragma pack(push) 将当前字节对齐值压入编译栈栈顶.
  5. #pragma pack(pop) 将编译栈栈顶的字节对齐值弹出并设为当前值.
  6. #pragma pack(push, n) 先将当前字节对齐值压入编译栈栈顶, 然后再将 n 设为当前值.
  7. #pragma pack(pop, n) 将编译栈栈顶的字节对齐值弹出, 然后丢弃, 再将 n 设为当前值.
  8. #pragma pack(push, identifier) 将当前字节对齐值压入编译栈栈顶, 然后将栈中保存该值的位置标识为 identifier .
  9. #pragma pack(pop, identifier) 将编译栈栈中标识为 identifier 位置的值弹出, 并将其设为当前值. 注意, 如果栈中所标识的位置之上还有值, 那会先被弹出并丢弃.
  10. #pragma pack(push, identifier, n) 将当前字节对齐值压入编译栈栈顶, 然后将栈中保存该值的位置标识为 identifier, 再将 n 设为当前值.
  11. #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")   //注意把行号转成了字符串

预留剩下的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值