перечисления в C с точки зрения c

#c #c #enums

#c #c #перечисления

Вопрос:

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

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

Исходный код C

 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» без классов и без возможности разграничения между двумя разными ключевыми словами «clubs». При попытке скомпилировать это я получаю следующее сообщение об ошибке

ошибка C2365: ‘Clubs’: переопределение; предыдущее определение было ‘enumerator’

Источник C

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

enum WeaponType {
    Rocks, Clubs, Guns
};

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

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

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

Ответ №1:

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

 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;
}
  

Комментарии:

1. Я всегда предпочитал тип в конце: Club_Suit, Club_Weapon, потому что это было ближе к синтаксису английского языка. Я направляюсь к Club_Building со своим Club_Weapon. Однако в итоге разница та же.

2. @Mooing Duck К концу дня, это просто предпочтение соглашения об именах. Пока это имеет смысл и согласуется, все должно быть хорошо 🙂 Я лично предпочитаю, чтобы тип был префиксом, потому что на английском мы читаем слева направо, поэтому я сразу вижу, к какому типу он принадлежит.

Ответ №2:

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

Ответ №3:

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

 enum Weapon {
    WeaponRocks,
    WeaponSocks,
    ...
};