[英]How do I fix an error in a header file typedef struct (expected a “;”)?
我从 github https://github.com/fabvalaaah/rlec和 Z86BB33755628454AFexp74F88F047EC894AZ.h 中下载了这个项目。 在项目的 rest 中,_bitmap 出现错误(标识符未定义)。 我正在使用 Visual Studio 2019。我该如何解决?
#ifndef BITMAP_H
#define BITMAP_H
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include <stdint.h>
#include "common.h"
const uint8_t lineFeed;
const uint8_t imageEnd;
typedef struct __attribute__((__packed__)) _bitmap{ //Error is here on _bitmap
uint8_t magicNumber[2];
uint32_t size;
uint8_t reserved[4];
uint32_t startOffset;
uint32_t headerSize;
uint32_t width;
uint32_t height;
uint16_t planes;
uint16_t depth;
uint32_t compression;
uint32_t imageSize;
uint32_t xPPM;
uint32_t yPPM;
uint32_t nUsedColors;
uint32_t nImportantColors;
}
_bitmap;
void printHeader(_bitmap* image);
int RLECompression(FILE* ptrIn, FILE* ptrOut);
int RLEDecompression(FILE* ptrIn, FILE* ptrOut);
#endif /* BITMAP_H */
该代码使用 gcc 扩展。 所以编译它的最简单方法就是使用 gcc 编译器。
但你能做的就是改变
typedef struct __attribute__((__packed__)) _bitmap{
至
typedef struct _bitmap{
它可能会起作用,并且可能会破坏代码,具体取决于代码的其他部分发生的情况。 我的猜测是它会很好地工作,但我不能保证代码的作者没有做任何“聪明”的事情。
typedef struct __attribute__((__packed__)) _bitmap
这是在 GCC 中定义没有零填充的结构定义的方法。 要防止 MVSC 中的零填充,请使用#pragma pack
:
#pragma pack(push,1)
typedef struct _bitmap{ //Error is here on _bitmap
uint8_t magicNumber[2];
uint32_t size;
uint8_t reserved[4];
uint32_t startOffset;
uint32_t headerSize;
uint32_t width;
uint32_t height;
uint16_t planes;
uint16_t depth;
uint32_t compression;
uint32_t imageSize;
uint32_t xPPM;
uint32_t yPPM;
uint32_t nUsedColors;
uint32_t nImportantColors;
} _bitmap;
#pragma pack(pop)
正如你在这里看到的https://godbolt.org/z/Gr-Rsw它编译得很好。
请注意,禁用填充对于获得所需的确切结构很重要(前 2 个字节是“幻数”,然后是 4 个字节的大小等)。 在这种情况下,您可以从文件中读取第一个sizeof(_bitmap)
字节,并期望布局与结构中定义的完全相同。
如果没有#pragma pack
,这种结构的大小可能非常基于不同的架构。 例如这里的大小是 56 字节,这是因为编译器在magicNumber[2]
之后添加了填充以将其对齐到 4 字节,而使用pack
属性它是 54 字节(示例)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.