Каков размер перечисления в C?

Один из них возникает, когда вы хотите создать экземпляр открытого типа, определенный во внешнем пакете, и этот тип встраивает другие частные типы.

Пример:

package animals

type otherProps{
  Name string
  Width int
}

type Duck{
  Weight int
  otherProps
}

Как сделать вы создаете экземпляр Duck в своей собственной программе? Вот лучшее, что я мог бы придумать:

package main

import "github.com/someone/animals"

func main(){
  var duck animals.Duck
  // Can't instantiate a duck with something.Duck{Weight: 2, Name: "Henry"} because `Name` is part of the private type `otherProps`
  duck.Weight = 2
  duck.Width = 30
  duck.Name = "Henry"
}
137
задан mipadi 14 December 2008 в 01:07
поделиться

2 ответа

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

97
ответ дан 23 November 2019 в 23:29
поделиться

Взятый из текущего Стандарта C (C99): http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf

6.7.2.2 спецификатора Перечисления
[...]
Ограничения
выражение, которое определяет значение постоянного перечисления, должно быть выражением целочисленной константы, которое имеет значение, представимое как интервал
[...]
, Каждый перечислимый тип должен быть совместим с символом, типом целого числа со знаком или типом беззнаковых целых чисел. Выбор типа определяется реализацией, но должен быть способен к представлению значений всех участников перечисления.

Не то, чтобы компиляторы хорошо работают в следующем стандарт, но по существу: Если Ваше перечисление содержит что-либо еще, чем интервал, Вы находитесь в глубоком "неподдерживаемом поведении, которое может возвратиться, кусая Вас через год или две" территории.

90
ответ дан 23 November 2019 в 23:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: