2013-06-21 4 views
4

После того как я объявитьC++ синтаксис перечисление

enum color {red, blue, green}; 

есть ли разница между

color a=blue; 

и

enum color a=blue; 
+3

Больше, C вещь, действительно. Это та же самая сделка, что и 'struct'. – chris

+0

'color a = blue;' не будет работать, если вы сделали что-то вроде: 'enum color {blue} color;'. В этом случае вам нужно «enum color a = blue», чтобы различать объект и тип. Конечно, вы просто не должны перегружать имя перечисления таким образом. – bames53

ответ

9
enum MyEnumType { ALPHA, BETA, GAMMA }; 

enum MyEnumType x; /* legal in both C and C++ */ 
MyEnumType y;  // legal only in C++ 

enum { HOMER, MARGE, BART, LISA, MAGGIE }; 
2

В языке C (в отличие от C++), для создания имени color, вы должны ввести typedef enum scolor {red, blue, green} color;, или используйте определение, содержащее вопрос, используя enum colour a = blue; - в противном случае компилятор не будет знать, что такое color.

В C++, любой struct X, class Y или enum Z, автоматически псевдоним X в struct X и Y в class Y и Z в enum Z - тем самым снижая потребность в typedef struct X X; и т.д. (хотя это будет по-прежнему в силе, так как C++ является, в целом, обратно совместим с C).

Обе формы одинаково допустимы в C++. Это вопрос стиля, который вы предпочитаете.

5

Предполагая, что никакая другая декларация color не доступна, они означают одно и то же. Тем не менее, действительно необходимо предоставить другое определение color, и enum color может использоваться, чтобы убедиться, что этот тип используется.

enum color { red, blue, green }; 
color color(const char *); 
enum color a = red; 

На второй строке, указав тип возвращаемого значения, как color действителен, и относится к enum color. В третьей строке требуется ключевое слово enum, потому что color в противном случае ссылается на функцию, объявленную во второй строке.

Но для практических целей enum color и color в значительной степени означают то же самое.

+0

Привет, я пробовал ваш код, но получаю сообщение об ошибке: error: type 'main() :: color' без ссылки, используемой для объявления функции 'main() :: color color (const char *)' with linkage [-fpermissive] | , Я понятия не имею, что это значит. – focusHard

+0

@focusHard: Переместите определение функции за пределы основного (https://ideone.com/RgWBZx): http://stackoverflow.com/questions/16053148/type-with-no-linkage-used-to-declare-function -with-linkage – Bill

+0

@focusHard Вы помещаете это внутри функции, и в этом случае 'enum color' является локально-локальным типом, который не может быть параметром внешней функции. Как правило, пока вам разрешено определять локально-локальные типы, существуют ограничения на то, как эти типы могут использоваться. Я решил, что код в моем ответе будет полной, действительной единицей перевода. – hvd