枚举和结构体定义

3
我可以帮你翻译成如下内容:

使用 Codeblocks 编译我的项目时出现了错误。

问题出在一个枚举定义和一个结构体定义上。

它们都在一个头文件中定义,在我只在 .c 文件中使用这些枚举和结构体时能够正常工作。但是当我在另一个 .c 文件中包含该 .h 文件时,就会出现错误。以下是一些代码:

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

以下是翻译的结果:

所以这里的问题是,当我在eg. game.c或game.h中包含maps.h时,我遇到了这个错误:

错误:'enum Property'的嵌套重新定义

我不明白!


请添加 #pragma once (我认为这会有帮助) - elyashiv
#pragma once 似乎是ouah的解决方案!谢谢大家! - Math
2
@microbe:“#pragma once” 不具备可移植性,请使用头文件保护来实现可移植性。 - ouah
2个回答

6

你需要为头文件添加头文件保护,否则你将会得到多次声明的错误。

例如对于你的maps.h文件,应该这样写:


#ifndef MAPS_H
#define MAPS_H

// 这里是你的代码

#endif

#ifndef MAPS_H
#define MAPS_H

...


#endif

2

任何包含你的头文件的源文件都会声明一个单一的实例变量,可能的枚举值为 { BACKGROUND, FOREGROUND, BLOCK, EVENT }。我不确定这是否是您的意图。通常情况下,这样做并不是一个好习惯。

如果您想要声明一个枚举类型,并允许在其他地方创建实例,请将以下内容放入您的头文件中:

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

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

static Property_t property = BACKGROUND;

如果您想要创建一个可以从多个源文件中访问的变量,则需要将其放在头文件中:

请注意:保留HTML标签。

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

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

Property_t property = BACKGROUND;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接