【C】pragma pack指令

这篇具有很好参考价值的文章主要介绍了【C】pragma pack指令。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一.#pragma pack指令

每个特定平台上的编译器都有自己的默认“对齐系数"(也叫对齐模数)。程序员可以通过预编译命令,即pragma pack(n),n=1,2,4,8,16来改变这一系数,其中的n就是你要指定的对齐系数”。

#pragma pack是有关结构体字节对齐方式设置,指定数据在内存中的对齐方式。

指令 作用
#pragma pack (n) C编译器将按照n个字节对齐 ,n可以取值1,2,4,8,16
#pragma pack () 取消自定义字节对齐方式
#pragma pack(push) 将当前的对齐字节数压入栈顶,不改变对齐字节数
#pragma pack (push,n) 是指把原来对齐方式设置压栈,并设新的对齐方式设置为n个字节对齐
#pragma pack(pop) 恢复对齐状态 ,弹出栈顶对齐字节数,不改变对齐字节数
#pragma pack(pop,n) 弹出栈顶并直接丢弃,按照n字节对齐
pragma pack(show) 显示当前内存对齐的字节数,编辑器默认8字节对齐

加入push和pop可以使对齐恢复到原来状态,而不是编译器默认,可以说后者更优,但是很多时候两者差别不大。
例如,

#pragma pack(push)     //保存对齐状态

#pragma pack(4)           //设定为4字节对齐

相当于 #pragma  pack (push,4)  
#pragma  pack (1)   //调整结构体的边界对齐,
//让其以一个字节对齐;<使结构体按1字节方式对齐>

#pragma  pack ()

//例如:

#pragma pack(1)

struct sample
{
char a;
double b;
};

#pragma pack()

注:

若不用#pragma pack(1)和#pragma pack()括起来,则sample按编译器默认方式对齐(成员中size最大的那个)。即按8字节(double)对齐,则sizeof(sample)==16.成员char a占了8个字节(其中7个是空字节)。

若用#pragma pack(1),则sample按1字节方式对齐sizeof(sample)==9.(无空字节),比较节省空间啦,有些场和还可使结构体更易于控制。

二.应用实例

在网络协议编程中,经常会处理不同协议的数据报文。一种方法是通过指针偏移的方法来得到各种信息,但这样做不仅编程复杂,而且一旦协议有变化,程序修改起来也比较麻烦。

在了解了编译器对结构空间的分配原则之后,我们完全可以利用这一特性定义自己的协议结构,通过访问结构的成员来获取各种信息。

这样做,不仅简化了编程,而且即使协议发生变化,我们也只需修改协议结构的定义即可,其它程序无需修改,省时省力。下面以TCP协议首部为例,说明如何定义协议结构。其协议结构定义如下:文章来源地址https://www.toymoban.com/news/detail-589389.html

#pragma pack(1) // 按照1字节方式进行对齐
struct TCPHEADER 
{
     short SrcPort; // 16位源端口号
     short DstPort; // 16位目的端口号
     int SerialNo; // 32位序列号
     int AckNo; // 32位确认号
     unsigned char HaderLen : 4; // 4位首部长度
     unsigned char Reserved1 : 4; // 保留6位中的4位
     unsigned char Reserved2 : 2; // 保留6位中的2位
     unsigned char URG : 1;
     unsigned char ACK : 1;
     unsigned char PSH : 1;
     unsigned char RST : 1;
     unsigned char SYN : 1;
     unsigned char FIN : 1;
     short WindowSize; // 16位窗口大小
     short TcpChkSum; // 16位TCP检验和
     short UrgentPointer; // 16位紧急指针
}; 
#pragma pack()

到了这里,关于【C】pragma pack指令的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32单片机(九)USART串口----第一节:USART串口协议

    ❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括51单片机和STM32单片机两部分;建议先学习51单片机,其是STM32等高级单片机的基础;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 :适用于想要从零基础开始学习入门单片机,且有一定C语言基础的的童鞋

    2024年02月16日
    浏览(35)
  • POWERLINK协议在stm32单片机+w5500移植成功经验分享

    连续折腾了多个晚上,又趁周末又花了一天时间,终于把powerlink协议移植成功到单片机上啦。本想放弃,但想了下不管我能不能用上,结个尾吧,分享给有需要的人。放弃并不难,但坚持一定很酷。为了移植测试这个协议花了不少血本。stm32开发板就买了两套,其中第一套板

    2024年02月09日
    浏览(44)
  • K_A23_001 基于STM32等单片机AT指令驱动ESP-01/ESP-01S实现手机遥控点灯

    其他资料目录 直戳跳转 单片机型号 测试条件 模块名称 代码功能 STC89C52RC 晶振11.0592M ESP-01/ESP-01S模块 STC89C52RC驱动ESP-01/ESP-01S模块 实现手机遥控点灯 STM32F103C8T6(标准库) 晶振8M/系统时钟72M ESP-01/ESP-01S模块 STM32F103C8T6驱动ESP-01/ESP-01S模块 实现手机遥控点灯 ESP-01/ESP-01S模块 引脚

    2024年01月21日
    浏览(31)
  • 关于CW32单片机pack包安装 KEIL IAR

      CW32 系列微控制器软件开发工具入门 1. 下载芯片包 官方下载链接: 武汉鑫源半导体 2. 安装芯片包 双击芯片包.pack文件 支持 CW32F 系列的 IDE 支持 CW32F 系列的工具链: • • EWARM v7.70 或更高版本 MDK-ARM v5.17 或更高版本 2.1 EWARM 工具链 2.1.1 EWARM V9.30 或更高版本 从 EWARM V9.30 版本

    2024年01月23日
    浏览(30)
  • STM32+ESP-01s+EMQX实现单片机MQTT协议传输数据上云(二)STM32F103与ESP-01s的Usart通信,实现STM32连接上网上云

    单片机:STM32F103c8t6 WiFi模块:ESP8266-01s EMQX:自身服务器上搭载emq服务器或者借用emqx window 版本  USB TO TTL模块:CH340 因为CH340不能给ESP-01s供3.3V的电,所以测试时需要外加供电           本章中涉及到的技术原理主要为ESP01S wfi模块的AT指令通信,我在上一篇文章给大家提到了

    2024年02月16日
    浏览(39)
  • 单片机 STM32启动文件详解(汇编语言解析)

    以前讲了固件库,从ST官网下载的固件库里面,有许多的启动文件(汇编语言写的.s文件) 启动文件 说明 startup_stm32f10x_ld.s Low Density 小容量 startup_stm32f10x_md.s Medium Density 中容量 startup_stm32f10x_hd.s High Density 高容量 startup_stm32f10x_xl.s Extra Large Density 超大容量 startup_stm32f10x_cl.s Con

    2023年04月25日
    浏览(42)
  • STM32--PACK下载(stm32芯片支持包)

    安装Pack包 -- 3种方式,推荐使用最后一种         Pack包的作用是让keil软件支持对应的芯片开发,所以每开发一种类型的型号需要先将keil支持的pack包安装才行 1、直接在keil5上面进行下载(速度较慢) 2、去keil官网上下载 4、可以选Download Recommended Pack下载最新版本也可以点击

    2024年04月22日
    浏览(28)
  • C语言-单片机:STM32程序烧录的几种方法

    STM32微控制器提供了多种程序烧录(也称为编程或固件更新)方式,这些方法允许用户将编译后的程序代码(通常为HEX或BIN格式)下载到MCU的闪存中。以下是几种常见的STM32程序烧录方式: ST-LINK : ST-LINK/V2 : 这是最常用的官方开发工具之一,可以直接通过USB接口与PC连接。S

    2024年04月26日
    浏览(32)
  • 如何下载stm32 pack包

    新安装的keil软件,很多芯片没有安装pack包就无法正常编译,所以需要取对应网站下载对应的pack包。 keil device配置页面: 官网地址:https://www.keil.com/ 下拉找到STMicroelectronics: 找到对应的F4系列: 点击下载: 等待下载完成,双击安装即可。 本文主要介绍如何去keil官网下载对

    2024年02月12日
    浏览(34)
  • 自用纯C语言实现任务调度(可用于STM32、C51等单片机)

      这个任务调度模块的实现是形成于毕设项目中的,用在 STM32 中,断断续续跨度2个月实现了一些基本功能,可能后面再做其他项目时会一点点完善起来,也会多学习相关知识来强化模块的实用性和高效性,毕竟用自己自主实现出来的功能还是蛮舒心的。   整体上的结构

    2023年04月09日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包