第一次在这里发帖,我是C ++编程的初学者,学习它主要是因为我想知道它,因为它总是很有趣,因为它是如何工作的等等。
我正在尝试使用SFML 2.0制作一个简单的游戏,我的问题是:
我有一个枚举,例如:
enum GameState
{
Menu,
Battle,
Map,
SubMenu,
Typing
};
所以,我想使用
创建一个这样的变量 GameState State = Menu;
然后,将其传递给另一个文件
extern GameState State;
但我收到错误
error: 'GameState' does not name a type
如何将枚举传递给另一个文件?我试图通过将它作为main.cpp中的全局变量,然后将其包含在另一个文件的头文件中来实现。
答案 0 :(得分:7)
您必须将枚举放在头文件中,并使用#include
将其包含在源文件中。
这样的事情:
档案gamestate.h
:
// These two lines prevents the file from being included multiple
// times in the same source file
#ifndef GAMESTATE_H_
#define GAMESTATE_H_
enum GameState
{
Menu,
Battle,
Map,
SubMenu,
Typing
};
// Declare (which is different from defining) a global variable, to be
// visible by all who include this file.
// The actual definition of the variable is in the gamestate.cpp file.
extern GameState State;
#endif // GAMESTATE_H_
档案gamestate.cpp
:
#include "gamestate.h"
// Define (which is different from declaring) a global variable.
GameState State = Menu; // State is `Menu` when program is started
// Other variables and functions etc.
档案main.cpp
:
#include <iostream>
#include "gamestate.h"
int main()
{
if (State == Menu)
std::cout << "State is Menu\n";
}
现在全局变量State
在文件gamestate.cpp
中定义,但由于{{gamestate.h
,可以在包含extern
的所有源文件中引用它1}}该文件中的声明。更重要的是,当您在源文件中包含GameState
时,也会定义枚举类型gamestate.h
,以便您未定义的错误将消失。
有关声明和定义之间的区别,请参阅例如https://stackoverflow.com/a/1410632/440558。
答案 1 :(得分:1)
问题似乎是你已经在一个文件中定义了GameState的含义,但是2个文件需要知道定义。实现此目的的典型方法是创建一个头文件(扩展名为.h),在两个源代码文件(最有可能是.cpp)中包含(使用#include),以便它出现在两者中。这比复制和粘贴定义要好(在其他地方使用它只需要#include语句;如果定义更改,只需在.h文件中更改它,并且包含它的每个文件在重新编译时都会获得更改)