2010-01-07 19 views
3

我正面临一个非常奇怪的问题。宏未申报,但在标头中定义

这是map.h:

#define MAP_WIDTH 256 
#define MAP_HEIGHT 256 

typedef struct { 
    char exit_n; 
    char exit_s; 
    char exit_w; 
    char exit_e; 
} room; 

room map[MAP_WIDTH][MAP_HEIGHT]; 

void generate_map(); 

这map.c:

#include "map.h" 

void generate_map() 
{ 
    char room_x, room_y; 

    room_x = MAX_WIDTH/2; 
    room_y = MAX_HEIGHT/2; 

    // first room 
    map[room_x][room_y].exit_n = 1; 
} 

所以,没有什么异国情调。问题是编译器抱怨这两个定义的常量MAX_WIDTH和MAX_HEIGHT:

map.c: In function ‘generate_map’: 
map.c:18: error: ‘MAX_WIDTH’ undeclared (first use in this function) 
map.c:18: error: (Each undeclared identifier is reported only once 
map.c:18: error: for each function it appears in.) 
map.c:19: error: ‘MAX_HEIGHT’ undeclared (first use in this function) 

我在做什么错?

+1

不要感到羞耻。这些东西可能非常难看,直到你将它们展示给一个无私的派对。我相信我们都有过这样的经历。 – 2010-01-07 21:05:38

+1

没有理由删除,值得你花时间问,对吧?只要接受最好的答案。 (和谁低调:为什么?) – 2010-01-07 21:05:57

+0

我开始用C编程多年后不再使用它,所以我觉得它仍然非常不安全,过了一段时间寻找这个问题,我认为这是一个阴险的东西,而不是那么不白:) – pistacchio 2010-01-07 21:11:03

回答

12

看起来你正在使用 MA X _width(带有X),并在两种情况下 MA P _width(用P),同为 _height常数。

5

在你的头文件中,你会说#define MAP_HEIGHT,在map.c中,你正在尝试使用MAX_HEIGHT。他们不一样。

3

我知道的所有C编译器都有一个标志在预处理阶段后停止。这对于解决与预处理器相关的问题非常有用。例如,海湾合作委员会有-E标志:

$ gcc -E map.c 
# 1 "map.c" 
# 1 "<built-in>" 
# 1 "<command line>" 
# 1 "map.c" 
# 1 "map.h" 1 



typedef struct { 
    char exit_n; 
    char exit_s; 
    char exit_w; 
    char exit_e; 
} room; 

room map[256][256]; 

void generate_map(); 
# 2 "map.c" 2 

void generate_map() 
{ 
    char room_x, room_y; 

    room_x = MAX_WIDTH/2; 
    room_y = MAX_HEIGHT/2; 


    map[room_x][room_y].exit_n = 1; 
} 

希望这将提供足够的线索来发现错误。

+0

我现在一直使用这个标志,谢谢你的提示。 – zmbush 2010-01-12 06:47:51