#ifndef只能保证重复包含时,只包含一次。但snake.cpp和main.cpp是分别进行编译的,snake.cpp里的#define对于main.cpp不起作用。也就是说在编译main.cpp时,snake.h是第一次包含,因此又有一个ch,相互链接时就会发现重定义。正确的作法应该这样:
1)在snake.h里改为:
extern char ch; // 只声明不定义
extern void f();
2)在snake.cpp里加上:
char ch; // 在源文件里,这才是定义,仅此一次
1)在snake.h里改为:
extern char ch; // 只声明不定义
extern void f();
2)在snake.cpp里加上:
char ch; // 在源文件里,这才是定义,仅此一次