3

コードブロックを使用してプロジェクトをコンパイルするときにエラーが発生します。私の問題は、列挙型の定義と構造体の定義に起因しています。

それらはヘッダーファイルでボット定義されており、.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.hiにはこのエラーがあります。

エラー:「列挙型プロパティ」のネストされた再定義

理解できません !

4

2 に答える 2

6

ヘッダーファイルにヘッダーガードを追加する必要があります。そうしないと、複数の宣言が取得されます。

たとえば、次のようにmaps.h囲みます。

#ifndef MAPS_H
#define MAPS_H

...


#endif
于 2012-10-14T20:32:42.997 に答える
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;
于 2012-10-14T23:51:34.977 に答える