2013-12-17 2 views
2

Я нашел уже это: extern enum in c++ Но мне это не помогло. У меня есть config.h и config.cpp в config.hi есть мое перечисление:C++ extern enums

#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; 
     ^

ответ

7

Вы не сможете определить enum извне. В C++ 11 вы можете переадресовать провозгласить enum, однако:

enum class Items: char; 

..., а затем определить его:

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

Заметим, однако, что вы можете использовать теги Enumerator только там, где определение было рассмотрено.

Основываясь на ваших комментариях о нескольких определениях, у вас нет защитников в вашем заголовке, и один и тот же заголовок включается несколько раз. То есть, кажется, вы могли бы иметь заголовок что-то вроде этого:

// items.h 
#ifndef INCLUDED_ITEMS 
#define INCLUDED_ITEMS 

enum Items { ... }; 

#endif 

Судя по ней, вы пытаетесь сложить представление игры в в определении их имен. Это, вероятно, не очень хорошо работает, тем более что они могут изменить внешний вид (например, вы можете использовать PAC между C и O). Скорее всего, фактический код будет говорить об этих именах, и вы будете иметь в нескольких местах. Просто используйте enum, чтобы определить различные элементы, не образующие какое-либо значение для них и определить их представление в другом месте:

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

// elsewhere 

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

... а затем просто использовать ItemDisplay[item] всякий раз, когда вам нужно нарисовать item.

+0

Хм, я не использую C++ 11. Я просто хочу иметь перечисление в config.h. Но если я определяю его там, он говорит мне, что у меня есть несколько определений. Я попытался решить это, объявив его extern и определив его в config.cpp :( – AnnoyedGuy

+0

@AnnoyedGuy: Я понимаю, что вы хотите отделить какое-то объявление от его определения. Однако неясно, чего вы на самом деле пытаетесь достичь! Цель состоит в том, чтобы сконфигурировать 'char', используемый для представления разных игровых фигур, например, вы использовали бы другой подход. –

+0

да перечисления должны представлять игровые фигуры. Какой подход я бы использовал для них? – AnnoyedGuy

0

Ответ на ваш вопрос в том, что вы должны использовать это, чтобы Экстерн extern Items fieldItems; попробовать, чтобы иметь определение перечисления в файле заголовка, а затем попробуйте ехЬегп

0

Вы определили тип, а не переменная. Тип не может быть статическим или внешним. Вы должны объявить переменную этого типа.

0

extern enum Элементы не декларируют ничего: он просто сообщает вам, что существует тип перечисления, называемый Items. Я думаю, что вы действительно хотите

extern enum Items fieldItems; 

Альтернативно

enum Items; 
extern Items fieldItems; 
+0

Не работает для меня :/ – AnnoyedGuy

0

extern enum Items; является синтаксической ошибкой.

Вы используете extern, чтобы объявить объект , на который вы хотите ссылаться, что определено в другом месте. Однако перечисления представляют собой сборники компиляций констант; они не имеют представления в объектных файлах.

Идеология C и C++ такова, что каждая единица компиляции должна быть самодостаточной с целью компиляции, то есть все необходимые объекты компиляции должны быть определены внутри единицы компиляции.