使用codeblocks编译项目时出错。 我的问题来自枚举定义和结构定义。
它们是在头文件中定义的机器人,因为我只在.c关联文件中使用那些枚举和结构,所以它有效。但是当我将.h文件包含在另一个.c文件中时,我会收到错误,这里有一些代码;
maps.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);
maps.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.h我有这个错误;
错误:嵌套重新定义&#39;枚举属性&#39;
我不明白!
答案 0 :(得分:4)
您需要在标题文件中添加标题保护,否则您将获得多个声明。
例如,您的maps.h
用它包围它:
#ifndef MAPS_H
#define MAPS_H
...
#endif
答案 1 :(得分:2)
包含头文件的任何源文件都将声明一个实例变量,其可能的枚举值为{BACKGROUND,FOREGROUND,BLOCK,EVENT}。我不确定这是你的意图。一般来说,这样做并不好。
如果您打算声明一种枚举并允许在其他地方创建实例,请将其放在头文件中:
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;