warning: malformed '#pragma pack(pop[, id])' - ignored
关于这个警告信息,就是说忽略了我定义的结构体对齐信息,那么他就会按照默认的对齐来了。运行结果自然也是有错误的。
经过测试对比,发现是gcc版本问题,我的ubuntu中,gcc版本为4.4.1,还算比较新的。而交叉编译工具链中arm-linux-gcc中的gcc版本为3.4.5,比较老了。
查找了一些资料,发现使用 _attribute_((packed)) 可以解决这个问题,_attribute_((packed)) 的作用是告诉编译器取消结构在编译过程中的优化对齐,按照实际占用字节数进行对齐,是GCC特有的语法。关于 _attribute_((packed)) 可以看这里 http://blog.csdn.net/wesleyluo/article/details/7565165,里面讲的很详细。
写一个测试用例来看看
#include <stdio.h>#ifndef PACK
#define PACK __attribute__ ((packed))
#endifstruct a1
{short a;int b;char c;
}PACK A1;struct a2
{short a;int b;char c;
}A2;int main()
{printf("sizeof(A1):%d\n",sizeof(A1));printf("sizeof(A2):%d\n",sizeof(A2));
}
编译 gcc test.c -o test 和 arm-linux-gcc test.c -o test1
没有之前的警告信息
分别在电脑端和开发板运行,结果一致。
使用 _attribute_((packed)) 可解决这个警告问题。
转载于:https://www.cnblogs.com/ZXNblog/p/4051413.html
warning: malformed '#pragma pack(pop[, id])' - ignored相关推荐
- 详解C/C++中的的:#pragma pack(push) 、#pragma pack(pop) 和#pragma pack()
前言 我们知道结构体内存对齐字节可以通过#pragma pack(n) 的方式来指定. 但是,有没有想过一个问题,某些时候我想4字节对齐,有些时候我又想1字节或者8字节对齐,那么怎么解决这个问题呢? ...
- #pragma pack(push,1) #pragma pack(pop)
1 引子 在程序中,有的时候我们定义结构体的时候,要用#pragma pack(push,1) & #pragma pack(pop)类似代码将结构体包起来. 一般形式如下: #pragma ...
- #pragma pack详解
数据对齐 程序中变量的存储可以直接影响到程序的运行速度.计算机中都是以字节划分内存空间,通常编译器会为我们选择适合目标平台的对齐策略,但是有时候也带了一些麻烦,要自定义变量的对齐策略我们就需要用到#p ...
- Linux C/C++编程——常用关键字pragma pack和attribute_packed总结
(一)pragma pack使用说明 用sizeof运算符求算某结构体所占空间时,并不是简单地将结构体中所有元素各自占的空间相加,这里涉及到内存字节对齐的问题,有时候为了内存对齐需要补齐空字节.通常写 ...
- #pragma pack 内存对齐
1. 用法 #pragma pack是C/C++里面设置字节对齐方式的预编译函数 2. 解释 先看下面代码: #include <iostream> using namespace std ...
- C语言中 #pragma pack()
#pragma pack 这条指令主要用作改变编译器的默认对齐方式. pragma pack(show) //显示当前内存对齐的字节数,编辑器默认8字节对齐 #pragma pac ...
- 基础 - #pragma pack (n) 设置对齐方式
1 // pragma_pack.cpp : 定义控制台应用程序的入口点. 2 // 3 4 #include "stdafx.h" 5 #include <windows. ...
- #pragma pack(1)的作用
#pragma pack(n) 解释一: 每个特定平台上的编译器都有自己的默认"对齐系数"(也叫对齐模数).程序员可以通过预编译命令#pragma pack(n),n=1,2,4, ...
- 结构对齐--__packed与#pragma pack
1.ANSI C规定 ANSI C规定一种结构类型的大小是它所有字段的大小以及字段之间或字段尾部的填充区大小之和. 填充区就是为了使结构体字段满足内存对齐要求而额外分配给结构体的空间. 那么结构体本身 ...
- 结构体对齐,#pragma pack
一.结构体对齐 首先通过一个例子说明结构体对齐,可以看到,下面这个结构体占32字节(32位) typedef struct {double d;short s;int i;char c;short s ...
最新文章
- Python标准库介绍
- 边沿检测与信号同步?
- 【Redis系列】面试官:Redis中的数据已经过期,为什么还占用这内存?
- 命令行操作mysql
- 主要编程教学语言的讨论
- 兼容浏览器的insertAdjacentHTML
- docker_4 数据卷技术
- PO、VO、BO、POJO、DAO、DTO都是什么对象
- 事在四方,要在中央。圣人执要,四方来效
- oracle yum配置本地源,oel 7 本地yum源配置
- awk基础教程详细版
- return next(val for val in obj if safe_isfinite(val)) StopIteravtion报错解决方法
- 电脑查看Windows的具体过期日期
- 设计模式之六大设计原则【入门】
- LeetCode报错:Line 1034:Char9
- 特征值分解与奇异值分解原理与计算
- Mask R-CNN全文翻译
- android学习笔记----ListView和各种适配器简介
- 欧姆龙机器视觉软件系统FJ FZ FH系列仿真
- Kubernetes系统日志查看命令