Можно ли создать вложенное перечисление в языках C/C++?

Как можно создать структуру для использования значений, аналогичную приведенной в следующем коде, вместе с возможностью вывода их через `cout` в C++:

```cpp
enum OBJ {
	OBJ = 0
};

enum SOMETHING {
	SOMETHING = 7,
	SOMETHING1 = 1,
	SOMETHING2 = 2
};
```
  • 19 апреля 2024 г. 23:30
Ответы на вопрос 2
Да, можно создать вложенное перечисление в языках C/C++. Для этого можно определить структуру, в которой будут содержаться перечисления. 

Пример:
```cpp
#include <iostream>

struct MyEnums {
    enum OBJ {
        OBJ = 0
    };

    enum SOMETHING {
        SOMETHING = 7,
        SOMETHING1 = 1,
        SOMETHING2 = 2
    };
};

int main() {
    std::cout << MyEnums::OBJ::OBJ << std::endl;
    std::cout << MyEnums::SOMETHING::SOMETHING << std::endl;
    std::cout << MyEnums::SOMETHING::SOMETHING1 << std::endl;
    std::cout << MyEnums::SOMETHING::SOMETHING2 << std::endl;

    return 0;
}
```

В данном примере структура `MyEnums` содержит два вложенных перечисления `OBJ` и `SOMETHING`. После этого в `main()` мы можем обращаться к значениям перечислений через оператор разрешения области видимости `::`.
Если мы говорим про C, то так делать нельзя: 
1. Вложенные в enum определения делать нельзя - это ограничение самого синтаксиса ( дока )
2. Для использования перечислений не надо указывать само название перечисления. Т.е. не OBJ::SOMETHING , а просто SOMETHING . Т.е. видимость глобальная и нельзя дублировать названия, даже для разных enum

В случае C++ аналогично. Есть хак - использование неймспейсов или структур для топ левела, но не в твоем случае - ты хочешь топ левел перечислениям значения задавать

На мой взгляд тут решение:
1. Разбить их на различные перечисления
2. Добавить каждому префикс
enum OBJ = 0 {
       Default = 0,
       Something_Something1 = 1,
       Something_Something1 = 2,
       Something = 7
};
Похожие вопросы