繁体   English   中英

如何修复 header 文件 typedef 结构中的错误(应为“;”)?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM