将枚举传递给另一个文件? C ++

时间:2012-08-15 13:02:15

标签: c++

第一次在这里发帖,我是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中的全局变量,然后将其包含在另一个文件的头文件中来实现。

2 个答案:

答案 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文件中更改它,并且包含它的每个文件在重新编译时都会获得更改)