Перечисления C ++ и зависимость от компилятора - PullRequest
3 голосов
/ 27 июня 2011

В настоящее время у меня есть код с перечислением, в котором установлено одно значение, а остальные оставлены для установки компилятором с использованием предыдущего значения +1, или, я надеюсь, что так.

Зависит ли эта функциональность от компилятора перечислимого типа, поясняется пример ниже.

enum FUNC_ERROR_CODE    
{
    FUNC_SUCCESS,
    FUNC_ERROR_1 = 24,
    FUNC_ERROR_2,
    FUNC_ERROR_3
}

Можно ли предположить, что FUNC_ERROR_2 будет иметь значение 25, а FUNC_ERROR_3 будет иметь значение 26, независимо от используемого компилятора.

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

Ответы [ 4 ]

6 голосов
/ 27 июня 2011

Можно с уверенностью предположить, что:

  • Объявление перечисления [dcl.enum]

    Идентификаторы в перечислителе-Список объявляется как константы и может появляться везде, где требуются константы.Определение перечислителя с = дает ассоциированному перечислителю значение, указанное константным выражением.Выражение-константа должно иметь тип целого или перечисления. Если первый перечислитель не имеет инициализатора, значение соответствующей константы равно нулю.Определение перечислителя без инициализатора дает перечислителю значение, полученное путем увеличения значения предыдущего перечислителя на один .

Но , еслиу вас есть типизированное перечисление: Используйте его !Не отказывайтесь от преобразования в целые числа.

1 голос
/ 27 июня 2011

Это безопасно для Visual Studio 2010.Посмотрите на следующий пример из msdn :

" Любой перечислитель в списке, включая первый, может быть инициализирован значением, отличным от значения по умолчанию. Предположим, объявлениеКостюма были следующие:

enum Suit {
   Diamonds = 5,
   Hearts,
   Clubs = 4,
   Spades
};

Тогда значения Алмазов, Черв, Клубов и Пик были бы 5, 6, 4 и 5, соответственно. Обратите внимание, что 5 используется более одного раза."

1 голос
/ 27 июня 2011

ИМХО, если ваши перечисления должны иметь фиксированные значения, а затем точно зафиксировать эти значения, вы будете уверены в значениях, содержащихся в ваших перечислениях.

Но если вам нужно только сравнить свои перечисления друг с другом,пусть компилятор сделает это за вас.Должно быть безопасно написать несколько сравнений, подобных этому if FUNC_ERROR_2 > FUNC_ERROR_1 ...

0 голосов
/ 27 июня 2011

Я почти уверен, что компилятор вынужден увеличиваться для каждого нового значения.

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