C++外部枚举

Ann*_*Guy 2 c++ enums extern

我已经发现了这个:c ++中的extern enum 但它对我帮助不大.我有一个config.h和config.hi中的config.cpp有我的枚举:

#ifndef CONFIG_H
#define CONFIG_H
extern enum Items;
#endif
Run Code Online (Sandbox Code Playgroud)

在我的config.cpp中,我声明了枚举:

#include "config.h"
 enum Items {
    PAC = 'C', GHOST = '@', FRUIT = 'o', POINTS = '.', WALL = '#', EMPTY = ' ', UNDEFINED = '+'
} fieldItems;
Run Code Online (Sandbox Code Playgroud)

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

config.cpp:20:13: error: a storage class can only be specified for objects and functions
 extern enum Items;
         ^
Run Code Online (Sandbox Code Playgroud)

Die*_*ühl 8

您将无法在enum外部定义.在C++ 11中,您可以转发声明enum,但是:

enum class Items: char;
Run Code Online (Sandbox Code Playgroud)

......然后定义它:

enum class Items: char {
       PAC = 'C', GHOST = '@', FRUIT = 'o', POINTS = '.', WALL = '#', EMPTY = ' ', UNDEFINED = '+'
};
Run Code Online (Sandbox Code Playgroud)

但请注意,只能在看到定义的位置使用枚举器标记.

根据您对多个定义的评论,您的标头中没有包含保护,并且多次包含相同的标头.也就是说,似乎你可以有这样的标题:

// items.h
#ifndef INCLUDED_ITEMS
#define INCLUDED_ITEMS

enum Items { ... };

#endif
Run Code Online (Sandbox Code Playgroud)

从它的外观来看,你试图将游戏的表现形式折叠成他们名字的定义.这可能不工作也很好,尤其是因为它们可能会改变外观(您可能希望有PAC交替CO,例如).很可能实际的代码会谈论这些名称,你会在多个地方.只需使用a enum来定义不为它们定义任何值的不同项,并在其他地方定义它们的表示:

enum Items { PAC, GHOST, FRUIT, POINTS, WALL, EMPTY, UNDEFINED };
extern char ItemDisplay[];

// elsewhere

char ItemDisplay[] = { 'C', '@', 'o', '.', '#', ' ', '+' };
Run Code Online (Sandbox Code Playgroud)

...然后只需ItemDisplay[item]在需要绘制时使用item.