Как работает инициализация типов 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
Руководство для начинающих по веб-разработке на React.js
Руководство для начинающих по веб-разработке на React.js
Веб-разработка - это захватывающая и постоянно меняющаяся область, которая постоянно развивается благодаря новым технологиям и тенденциям. Одним из...
Разница между Angular и React
Разница между Angular и React
React и AngularJS - это два самых популярных фреймворка для веб-разработки. Оба фреймворка имеют свои уникальные особенности и преимущества, которые...
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Веб-скрейпинг, как мы все знаем, это дисциплина, которая развивается с течением времени. Появляются все более сложные средства борьбы с ботами, а...
Калькулятор CGPA 12 для семестра
Калькулятор CGPA 12 для семестра
Чтобы запустить этот код и рассчитать CGPA, необходимо сохранить код как HTML-файл, а затем открыть его в веб-браузере. Для этого выполните следующие...
ONLBest Online HTML CSS JAVASCRIPT Training In INDIA 2023
ONLBest Online HTML CSS JAVASCRIPT Training In INDIA 2023
О тренинге HTML JavaScript :HTML (язык гипертекстовой разметки) и CSS (каскадные таблицы стилей) - две основные технологии для создания веб-страниц....
Как собрать/развернуть часть вашего приложения Angular
Как собрать/развернуть часть вашего приложения Angular
Вам когда-нибудь требовалось собрать/развернуть только часть вашего приложения Angular или, возможно, скрыть некоторые маршруты в определенных средах?
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

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