C++外部枚举类型

3
我已经找到了这个:在C++中的外部枚举 但它并没有对我有太大帮助。我有一个config.h和config.cpp,在config.h中我有我的枚举:
#ifndef CONFIG_H
#define CONFIG_H
extern enum Items;
#endif

而在我的config.cpp文件中,我已经声明了该枚举:

#include "config.h"
 enum Items {
    PAC = 'C', GHOST = '@', FRUIT = 'o', POINTS = '.', WALL = '#', EMPTY = ' ', UNDEFINED = '+'
} fieldItems;

但是如果我尝试编译它,编译器会给我以下错误:

config.cpp:20:13: error: a storage class can only be specified for objects and functions
 extern enum Items;
         ^
5个回答

8

您无法在外部定义一个enum。然而,在C++11中,您可以进行前向声明一个enum

enum class Items: char;

... 然后定义它:

enum class Items: char {
       PAC = 'C', GHOST = '@', FRUIT = 'o', POINTS = '.', WALL = '#', EMPTY = ' ', UNDEFINED = '+'
};

需要注意的是,只有在定义被看到的情况下才能使用枚举器标签。

根据你对多个定义的评论,你的头文件中没有包含保护,并且同一个头文件被包含了多次。也就是说,你可能有一个类似于以下代码的头文件:

// items.h
#ifndef INCLUDED_ITEMS
#define INCLUDED_ITEMS

enum Items { ... };

#endif

看起来,您正在尝试将游戏的表示折叠到名称的定义中。这可能不太可行,特别是因为它们可能会改变外观(例如,您可能希望 PACCO 之间切换)。最可能实际的代码将关于这些名称进行讨论,并且您将在多个地方使用它们。只需使用enum来定义不同的项目而不为它们定义任何值,并在其他地方定义它们的表示:
enum Items { PAC, GHOST, FRUIT, POINTS, WALL, EMPTY, UNDEFINED };
extern char ItemDisplay[];

// elsewhere

char ItemDisplay[] = { 'C', '@', 'o', '.', '#', ' ', '+' };

只需使用ItemDisplay [item]即可在需要绘制item的时候使用。


嗯,我没有使用C++11。我只是想在config.h文件中有一个枚举。但如果我在那里定义它,它会告诉我有多个定义。我尝试通过在config.cpp文件中声明它并定义它来解决这个问题:( - AnnoyedGuy
@AnnoyedGuy:我知道你想把一些声明与定义分开。然而,你实际上想要实现什么还不清楚!如果你的目标是配置用于表示不同游戏角色的“char”,你可以使用不同的方法。 - Dietmar Kühl
是的,枚举应该代表游戏中的角色。我应该采用什么方法来处理它们? - AnnoyedGuy
1
@AnnoyedGuy,把你整个枚举定义放进config.h文件中的#ifndef/#endif括号里。如果你遇到多次定义的错误,那一定是由于其他原因引起的。 - ach

1

extern enum Items; 是语法错误。

你使用 extern 声明一个你想要引用的在其他地方定义的 链接时 实体。然而,枚举是 编译时 常量的集合;它们在目标文件中没有表示。

C 和 C++ 的思想是每个编译单元必须自给自足,即所有必需的 编译时 实体必须在编译单元内定义。


0

extern枚举项并未声明任何内容:它只是告诉您存在一个名为Items的枚举类型。我认为你真正想要的是

extern enum Items fieldItems;

或者

enum Items;
extern Items fieldItems;

0

你的问题的答案是,你需要使用这个来 extern extern Items fieldItems; 尝试在头文件中定义枚举,然后再尝试 extern


0
你定义了一个类型,而不是一个变量。类型不能是静态的或外部的。你必须声明该类型的变量。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接