Если у меня есть объявление типа перечисления в рекурсивной функции, будет ли оно «создано» несколько раз?
Работает ли он как '#define' в том смысле, что он просто говорит препроцессору «поменять местами» значения (но с учетом области действия)? Что произойдет здесь, например:
void recuFun()
{
enum someEnum {UP, DOWN, LEFT, RIGHT}; // Initialized multiple times?
/* ... */
recuFun();
}
Я знаю, что типы enum не являются объектами и поэтому не будут выделяться в памяти. но я не уверен, что здесь происходит, и, насколько я знаю, это не "подкачка" препроцессора. такое ощущение, что я зря трачу память или что-то в этом роде.
И, пожалуйста, будьте осторожны, C и C++ на самом деле два очень разных языка. Некоторые вещи, которые могут показаться одинаковыми, на самом деле могут быть разными. Простые перечисления являются одним из пограничных случаев IIRC.
Вы знаете, что типы не являются объектами и не используют память, но все равно чувствуете, что зря тратите память?
enum
на самом деле не существует на уровне ассемблера/машинного кода; там все интегральные значения.
Объявление enum
или typedef enum
в рекурсивной функции не будет использовать больше ресурсов, чем объявление в любой другой области.
Действительно - не скомпилируется :)
@ 0___________ Код OP не скомпилируется, но мой ответ правильный, несмотря ни на что
void recuFun()
{
enum someEnum = {UP, DOWN, LEFT, RIGHT};
/*...*/
recuFun();
}
Ничего не делает, так как имеет недопустимый синтаксис.
Этот ничего не делает, только определяет тип перечисления, который не влияет на скомпилированный код.
void recuFun()
{
enum someEnum {UP, DOWN, LEFT, RIGHT};
/*...*/
recuFun();
}
Поскольку это определено внутри функции (которая является расширением gcc), область действия этого объявления ограничена областью действия этой функции.
Извините, '=' была опечатка
Перечисления, определенные внутри функций, являются расширением GCC? Clang и MSVC, похоже, тоже имеют это расширение.
Перечисления — это не что иное, как символические целочисленные константы. С кодом, который вы показываете, использование
DOWN
или1
точно так же.