Место нахождения значения перечисления в C - PullRequest
13 голосов
/ 30 июля 2009

Мне кажется, я где-то читал, что это недопустимо брать адрес значения перечисления в C (значения перечисления не являются lvalues; однако я не могу найти никакой информации по этому вопросу сейчас) , Это правильно, и если да, то почему?


Edit:

Вот пример, который поясняет, что я подразумеваю под «значением enum» выше. Я имею в виду брать адрес first_value ниже, а не адрес фактического экземпляра перечисления:

enum myenum
{
    first_value,
    second_value
};

Ответы [ 6 ]

27 голосов
/ 30 июля 2009

«Enum value» слегка двусмысленно; однако, я предполагаю, что вы имеете в виду следующее:

enum myenum
{
    first_value,
    second_value
};

В этом случае незаконно брать адрес first_value. Причина этого в том, что first_value на самом деле нигде не существует в памяти ... это просто константа, фактически другое имя для числа 0 (из которого, конечно, вы также не можете взять адрес).

Если, с другой стороны, вы имеете в виду, можете ли вы взять адрес переменной, объявленной как enum:

enum myenum x;
enum myenum *mypointer=&x;

тогда это определенно возможно.

18 голосов
/ 30 июля 2009

если у вас есть:

enum E {
    X, Y, Z
};

тогда вы не можете взять адреса X, Y или Z, больше, чем вы можете взять адреса 0, 1 или 2.

Однако вы можете взять адрес экземпляра enum:

typedef enum  {
   X, Y, Z
} E;

int main() {
  E e;
  E * ep;
  ep = & e;
}
10 голосов
/ 30 июля 2009

Перечисления используются для замены #define цепей:

#define SUCCESS 0
#define LITTLE_ERROR 1
#define BIG_ERROR 2

Это можно заменить на:

enum
{
    SUCCESS,
    LITTLE_ERROR,
    BIG_ERROR
};

Значение перечисления, такое как SUCCESS, является просто символом для целочисленной константы, которая не будет храниться где-либо в памяти программы. Таким образом, не имеет смысла брать его адрес.

5 голосов
/ 30 июля 2009

Имена значений для перечислений являются просто постоянными псевдонимами для целых чисел, поэтому бессмысленно пытаться взять их адрес Вы можете взять адрес enum variable просто отлично, конечно.

2 голосов
/ 13 января 2010

Пожалуйста, обратитесь к примеру ниже:

enum { FIRST,SECOND } var;

здесь FIRST и SECOND являются постоянными макросами. Поэтому оператор & не будет работать, так как он не сохраняется нигде в памяти

Но для var будет назначена ячейка памяти и можно использовать оператор &.

0 голосов
/ 30 июля 2009

Насколько я помню, перечисления в C - просто целые числа. Так что это все равно что указывать на локальную переменную.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...