3

使用代码块编译我的项目时出现错误。我的问题来自枚举定义和结构定义。

它们是在头文件中定义的机器人,因为我只在 .c 关联文件中使用那些枚举和结构,所以它起作用了。但是当我将 .h 文件包含在另一个 .c 文件中时,出现错误,这是一些代码;

地图.h

#include <stdlib.h>
#include <stdio.h>

enum Property { BACKGROUND, FOREGROUND, BLOCK, EVENT };

typedef struct {
   char map_name[50];
   int width;
   int height;
   char* map_struct;
}rpgMap;
char getTileProperty(rpgMap map, int x, int y, int property);

地图.c

#include "maps.h"

char getTileProperty(rpgMap map, int x, int y, int property){    // Works
   char value = NULL;
   value = map.map_struct[(((y*(map.width-1))+y+x) * 4 ) + property];
   return value;
}   
rpgMap loadMap(unsigned char* map){
   rpgMap Map;
       //....
       //some code
       //...
   return Map;
}
// This works until i include maps.h in another .c file

所以这就是东西,当我在例如中包含 maps.h 时。game.c 或 game.hi 有此错误;

错误:“枚举属性”的嵌套重新定义

我不明白!

4

2 回答 2

6

您需要在头文件中添加标头保护,否则您将获得多个声明。

例如,对于您的maps.h环绕它:

#ifndef MAPS_H
#define MAPS_H

...


#endif
于 2012-10-14T20:32:42.997 回答
2

任何包含头文件的源文件都将声明一个实例变量,其可能的枚举值是 { 背景、前景、块、事件}。我不确定这是你的意图。一般来说,这样做不是很好的做法。

如果您打算声明一种枚举类型并允许在其他地方创建实例,请将其放在头文件中:

typedef enum { BACKGROUND, FOREGROUND, BLOCK, EVENT } Property_t;

然后在你的源文件中,像这样声明枚举:

static Property_t property = BACKGROUND;

如果您打算创建一个可以从多个源文件访问的变量,那么请将其放入您的头文件中:

typedef enum { BACKGROUND, FOREGROUND, BLOCK, EVENT } Property_t;
extern Property_t property;

并在单个源文件中声明变量:

Property_t property = BACKGROUND;
于 2012-10-14T23:51:34.977 回答