перечисления в C с точки зрения c ++ - PullRequest
3 голосов
/ 18 октября 2011

Я программист на C ++, и мне редко приходится иметь дело с GCC "C".В настоящее время я конвертирую некоторый код из C ++ в C для использования с компилятором GCC.

В C ++ я использовал бы следующий исходный код.Обратите внимание, что я бы использовал класс для области видимости.

C ++ Source

class Card {
public:
   enum Suit {
      Diamonds, Hearts, Clubs, Spades
   };
};

class Weapon {
public:
   enum WeaponType {
      Rocks, Clubs, Guns
   };
};

int main () {
 Suit a = Card::Clubs; 
 WeaponType b = Weapon::Clubs
}

В "C" без классов и без возможности различения двух разных ключевых слов "club".Я получаю следующее сообщение об ошибке при попытке скомпилировать

ошибка C2365: «Клубы»: переопределение;предыдущее определение было «перечислитель»

C Источник

enum Suit {
    Diamonds, Hearts, Clubs, Spades
};

enum WeaponType {
    Rocks, Clubs, Guns
};

int main () {
 Suit a = Clubs; 
 WeaponType b = Clubs
}

Итак, мои вопросы

  • Как мне объявить дваразные перечисления в одном и том же файле с одним и тем же ключевым словом?
  • Как добавить область видимости в перечисление, чтобы можно было назначать разные переменные разным перечислениям с одинаковым именем перечисления?

Ответы [ 3 ]

10 голосов
/ 18 октября 2011

Сделайте это так же, как в старые времена:

enum Suit {
    ST_Diamonds, ST_Hearts, ST_Clubs, ST_Spades
};

enum WeaponType {
    WT_Rocks, WT_Clubs, WT_Guns
};

int main () {
 Suit a = ST_Clubs; 
 WeaponType b = WT_Clubs;
 return 0;
}
3 голосов
/ 18 октября 2011

Этого нельзя сделать в стандартном C. Из Справочного руководства CA : «Идентификаторы, объявленные как константы перечисления, находятся в том же классе перегрузки, что и переменные функции и имена typedef», поэтому константы перечисления должны быть уникальными в заданная область применения.

2 голосов
/ 18 октября 2011

Из-за отсутствия пространств имен в C ваш единственный вариант - префикс:

enum Weapon {
    WeaponRocks,
    WeaponSocks,
    ...
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...