#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,
...
};