warning malformed '#pragma pack(push[, id], n)' - ignored

bmp.c:8: warning: malformed ‘#pragma pack(push[, id], <n>)‘ - ignored

bmp.c:33: warning: #pragma pack (pop) encountered without matching #pragma pack (push, <n>)

这个警告很重要不能忽略,我遇到的这个问题适用于编译器比较老的,因为韦东山自带的虚拟机Ubuntu9.10用的是/work/tools/gcc- 3.4.5 -glibc -2.3.6,而视频里用的编译器是4.3几,编译器比较高

,这个警告是说结构体对齐的问题。对于自带的较低的编译器解决此问题很简单: 修改BMP文件里的两个结构体

#include <config.h>

#include <pic_operation.h>

#include <picfmt_manager.h>

#include <file.h>

#include <stdlib.h>

#include <string.h>

//#pragma pack(push) /* 将当前pack设置压栈保存 */

//#pragma pack(1) /* 必须在结构体定义之前使用,这是为了让结构体中各成员按1字节对齐 */

typedef struct tagBITMAPFILEHEADER { /* bmfh */

unsigned short bfType;

unsigned long bfSize;

unsigned short bfReserved1;

unsigned short bfReserved2;

unsigned long bfOffBits;

} __attribute__((packed)) BITMAPFILEHEADER;

typedef struct tagBITMAPINFOHEADER { /* bmih */

unsigned long biSize;

unsigned long biWidth;

unsigned long biHeight;

unsigned short biPlanes;

unsigned short biBitCount;

unsigned long biCompression;

unsigned long biSizeImage;

unsigned long biXPelsPerMeter;

unsigned long biYPelsPerMeter;

unsigned long biClrUsed;

unsigned long biClrImportant;

} __attribute__((packed)) BITMAPINFOHEADER;

//#pragma pack(pop) /* 恢复先前的pack设置 */

warning malformed '#pragma pack(push[, id], n)' - ignored

时间: 2024-10-12 17:13:56

warning malformed '#pragma pack(push[, id], n)' - ignored的相关文章

warning: malformed &#39;#pragma pack(pop[, id])&#39; - ignored

关于这个警告信息,就是说忽略了我定义的结构体对齐信息,那么他就会按照默认的对齐来了.运行结果自然也是有错误的. 经过测试对比,发现是gcc版本问题,我的ubuntu中,gcc版本为4.4.1,还算比较新的.而交叉编译工具链中arm-linux-gcc中的gcc版本为3.4.5,比较老了. 查找了一些资料,发现使用 _attribute_((packed)) 可以解决这个问题,_attribute_((packed)) 的作用是告诉编译器取消结构在编译过程中的优化对齐,按照实际占用字节数进行对齐,

#pragma pack(push) 和#pragma pack(pop) 以及#pragma pack()

我们知道结构体内存对齐字节可以通过#pragma pack(n) 的方式来指定. 但是,有没有想过一个问题,某些时候我想4字节对齐,有些时候我又想1字节或者8字节对齐,那么怎么解决这个问题呢? 此时,#pragma pack(push) 和#pragma pack(pop) 以及#pragma pack()应运而生. 看测试代码:(说明,64位GCC,默认8字节对齐) 屏蔽了的代码选别看,只看这个结构体,在默认8字节对齐的方式下,sizeof大小为24个字节,这不再做分析,之前随笔分析过了. 然

#pragma pack(push,1)与#pragma pack(pop)

这是给编译器用的参数设置,有关结构体字节对齐方式设置, #pragma pack是指定数据在内存中的对齐方式. #pragma pack (n)             作用:C编译器将按照n个字节对齐.#pragma pack ()               作用:取消自定义字节对齐方式. #pragma  pack (push,1)     作用:是指把原来对齐方式设置压栈,并设新的对齐方式设置为一个字节对齐 #pragma pack(pop)            作用:恢复对齐状态 因

#pragma pack(push,1)与#pragma pack(1)的区别(转)

这是给编译器用的参数设置,有关结构体字节对齐方式设置, #pragma pack是指定数据在内存中的对齐方式. #pragma pack (n)             作用:C编译器将按照n个字节对齐.#pragma pack ()               作用:取消自定义字节对齐方式. #pragma  pack (push,1)     作用:是指把原来对齐方式设置压栈,并设新的对齐方式设置为一个字节对齐 #pragma pack(pop)            作用:恢复对齐状态 因

释析#pragma pack(push,n) #pragma pack(n) #pragma pack() #pragma pack(pop)

今天阅读别人写得的代码时,发现了#pragma pack(n) 这段代码,不知道加这个代码是什么个意思,然后自己就查了一下资料,然后写了段代码试了试,还有点那么个意思, 含义是:告诉编译器设置结构体的边界字节对齐方式,也就是所有数据在内存中是存储的方式. 这句话挺模糊的, 我们接下来先看几个例子程序, 例子一 struct weikangc { int nAge; char cSex; }; int main(int argc, char* argv[]) { printf("%d\r\n&qu

#pragma pack(push,1)与#pragma pack(1)的区别

这是给编译器用的参数设置,有关结构体字节对齐方式设置, #pragma pack是指定数据在内存中的对齐方式. #pragma pack (n)             作用:C编译器将按照n个字节对齐. #pragma pack ()               作用:取消自定义字节对齐方式. #pragma  pack (push,1)     作用:是指把原来对齐方式设置压栈,并设新的对齐方式设置为一个字节对齐 #pragma pack(pop)            作用:恢复对齐状态

转载: #pragma pack(push,1) &amp; #pragma pack(pop)

1 引子 在程序中,有的时候我们定义结构体的时候,要用#pragma pack(push,1) & #pragma pack(pop)类似代码将结构体包起来. 一般形式如下: #pragma pack(push,1): struct A { } : #pragma pack(pop): 这么做有什么目的呢? 注:下列内容来自网络. 2 #pragma pack简介 #pragma pack是指定数据在内存中的对齐方式, 在 C语言中,结构是一种复合数据类型,其构成元素既可以是基本数据类型(如in

#pragma pack([n|push|pop]) 用法

#pragma pack(): 取消用户自定义的结构体成员(或类的数据成员)的对齐方式,恢复编译器默认的对齐方式(VC++和GCC编译器默认8个字节对齐,并且,我们可以在编译器的设置里更改编译器的默认设置). #pragma pack(n): n可以取以下这5个数中的任意一个:1.2.4.8.16 自定义结构体成员的对齐方式. #pragma pack(push): 英文单词push是“压”的意思.编译器编译到此处时将保存对齐状态. #pragma pack(pop): 英文单词pop是”取“的

C++编译指令#pragma pack的配对使用

#pragma pack可以用来指定C++数据结构的成员变量的内存对齐数值(可选值为1,2,4,8,16). 本文主要是强调在你的头文件中使用pack指令要配对使用,以避免意外影响项目中其他源文件的结构成员的内存对齐. 如果影响了其他源文件的结构成员内存对齐,那么在你按照默认对齐来计算那些结构成员占用内存大小 或者使用指针移动计算结构成员偏移位置的时候,就可能会出现意料之外的异常. 主要可能的异常是内存定位错误或非法内存访问,结果可能导致错误的定位或数值,极端的情况下可能导致程序崩溃. 下面的例