Присвоение значений в C ++ с двойным перечислением - PullRequest
0 голосов
/ 28 мая 2018

В открытом исходном коде я нашел инициализацию перечисления, которая выглядела так:

enum example {
    FIRST,
    FIRST_AGAIN = FIRST,
    SECOND,
    ETC
};

Я был удивлен, как значения перечисления будут инициализированы, потому что FIRST_AGAIN получитзначение 0, потому что FIRST тоже 0.Но я думал, что это может повлиять на значение FIRST, равное -1, когда значение FIRST_AGAIN равно 0.

Итак, я посмотрел с отладчиком, какие значения присваиваются ключевым словам.FIRST и FIRST_AGAIN назначаются с 0.

Итак, мой вопрос, действительно ли это разрешено (GCC компилирует его, но что говорит стандарт C ++?) Для назначения двух ключевых слов вперечисление с тем же значением?И как компилятор переводит назначение?Поскольку, чтобы узнать значение FIRST, компилятор должен сначала пройти через все перечисление и посмотреть, назначено ли какое-либо ключевое слово, оттуда он мог бы назначить все другие значения, но он не знает, какое назначение FIRST_AGAIN = FIRST означает.

Может быть, вопрос глупый, и обычно делают что-то подобное.Какая польза от назначения двух ключевых слов с одинаковым значением?

1 Ответ

0 голосов
/ 28 мая 2018

Итак, мой вопрос: действительно ли разрешено (GCC компилирует, но что говорит стандарт C ++?) Назначать два ключевых слова в перечислении с одинаковым значением?

Отлично.Стандарт C ++ ничего не говорит об этом в нормативном тексте, поэтому он неявно разрешен, но включает в себя пример:

enum { a, b, c=0 };

, который определяет a и cкак ноль.

А как компилятор переводит присвоение?Поскольку, чтобы узнать значение FIRST, компилятору сначала нужно пройти через все перечисление

Нет, компилятору это делать не нужно.Определение перечислителя без явного значения не зависит от последующих определений перечислителя.Его значение равно значению предыдущего перечислителя плюс один, или ноль, если не было предыдущих перечислителей.

Возможно, вопрос глупый, и обычно что-то подобное делают.Какая польза от назначения двух ключевых слов с одинаковым значением?

Одна возможность:

enum E {
  A = 20,
  B = 30,
  C = 40,
  MIN = A,
  MAX = C
}

Здесь можно ожидать, что значения MIN иMAX может изменяться при добавлении или удалении перечислителей, но ожидается, что значения A, B и C останутся постоянными.При использовании C, где требуется C, и MIN и MAX, где требуется диапазон, код может быть ориентирован на будущее для более поздних версий любой библиотеки, определяющей это перечисление.

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