Как работает инициализация типов enums в рекурсивных функциях?

Если у меня есть объявление типа перечисления в рекурсивной функции, будет ли оно «создано» несколько раз?

Работает ли он как '#define' в том смысле, что он просто говорит препроцессору «поменять местами» значения (но с учетом области действия)? Что произойдет здесь, например:

void recuFun() 
{
  enum someEnum {UP, DOWN, LEFT, RIGHT}; // Initialized multiple times?
  /* ... */
  recuFun();
}

Я знаю, что типы enum не являются объектами и поэтому не будут выделяться в памяти. но я не уверен, что здесь происходит, и, насколько я знаю, это не "подкачка" препроцессора. такое ощущение, что я зря трачу память или что-то в этом роде.

Перечисления — это не что иное, как символические целочисленные константы. С кодом, который вы показываете, использование DOWN или 1 точно так же.

Some programmer dude 23.02.2023 01:41

И, пожалуйста, будьте осторожны, C и C++ на самом деле два очень разных языка. Некоторые вещи, которые могут показаться одинаковыми, на самом деле могут быть разными. Простые перечисления являются одним из пограничных случаев IIRC.

Some programmer dude 23.02.2023 01:46

Вы знаете, что типы не являются объектами и не используют память, но все равно чувствуете, что зря тратите память?

molbdnilo 23.02.2023 04:07
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
53
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

enum на самом деле не существует на уровне ассемблера/машинного кода; там все интегральные значения.

Объявление enum или typedef enum в рекурсивной функции не будет использовать больше ресурсов, чем объявление в любой другой области.

Действительно - не скомпилируется :)

0___________ 23.02.2023 01:30

@ 0___________ Код OP не скомпилируется, но мой ответ правильный, несмотря ни на что

Govind Parmar 23.02.2023 01:30
void recuFun() 
{
  enum someEnum = {UP, DOWN, LEFT, RIGHT}; 
  /*...*/
  recuFun();
}

Ничего не делает, так как имеет недопустимый синтаксис.

Этот ничего не делает, только определяет тип перечисления, который не влияет на скомпилированный код.

void recuFun() 
{
  enum someEnum {UP, DOWN, LEFT, RIGHT}; 
  /*...*/
  recuFun();
}

Поскольку это определено внутри функции (которая является расширением gcc), область действия этого объявления ограничена областью действия этой функции.

Извините, '=' была опечатка

Igor Zeck 23.02.2023 01:31

Перечисления, определенные внутри функций, являются расширением GCC? Clang и MSVC, похоже, тоже имеют это расширение.

Govind Parmar 23.02.2023 01:39

Другие вопросы по теме