Должен ли я бросить это таким образом? - PullRequest
4 голосов
/ 23 сентября 2010
size_t pixelsWidth = (size_t)bitmapSize.width;

Или вполне нормально обойтись без приведения к size_t?bitmapSize имеет тип CGSize ...

Ответы [ 5 ]

4 голосов
/ 23 сентября 2010

Вы должны использовать правильный тип, который, вероятно, CGFloat.size_t - это нечто интуитивное и неуместное.

3 голосов
/ 23 сентября 2010

В этом случае тип bitmapSize.width равен CGFloat (в настоящее время float на iPhone).

Преобразование из float в size_t имеет неопределенное поведение (согласно стандарту C- не уверен, предоставляет ли Apple какие-либо дополнительные гарантии), если преобразованное значение не укладывается в size_t.Когда это подходит, преобразование теряет дробную часть.Не имеет значения, является ли преобразование неявным или явным.

Приведение "хорошо" в том смысле, что в коде показано, что преобразование происходит, поэтому программисты, читающие код, не забудут,Это «плохо» в том смысле, что оно, вероятно, подавляет любые предупреждения, которые компилятор может дать вам, что это преобразование опасно.

Итак, если вы абсолютно уверены, что преобразование всегда будет работать, тогда вам нужен приведение(чтобы подавить предупреждение).Если вы не уверены, то вам не нужен актерский состав (и вам, вероятно, следует либо избегать преобразования, либо быть уверенным в себе).

В этом случае кажется вероятным, что преобразование безопасно, посколькуРазмер обеспокоен.Предполагая, что ваш объект CGSize представляет размер фактического элемента пользовательского интерфейса, он не будет таким уж большим.Комментировать в коде было бы неплохо, но программисты прекращают комментировать после пятидесятого раза и начинают думать, что это «очевидно», что, конечно, ширина изображения соответствует size_t.

Еще один вопрос заключается в том, является ли преобразование безопасным в отношении фракций.При каких обстоятельствах, если таковые имеются, размер будет дробным?

2 голосов
/ 23 сентября 2010

C поддерживает неявное приведение, и вы также получите предупреждение, если size_t по какой-то причине менее точен, чем CGSize.

1 голос
/ 23 сентября 2010

Тип size_t для чего-то совершенно другого, вы не должны использовать его для таких целей.
Его цель - выразить размеры разных типов в памяти.Например, sizeof(int) относится к типу size_t и возвращает размер типа int.

Как и предполагали другие, используйте соответствующий тип для этой переменной.

1 голос
/ 23 сентября 2010

Приведение обычно не требуется (а иногда и неправильно). C делает "правильные вещи" большую часть времени.

В вашем случае приведение не нужно (но не неправильно, просто избыточно).

Вам нужно разыграть

  • аргументы для printf, если они не соответствуют спецификации преобразования
    printf("%p\n", (void*)some_pointer)
  • аргументы для is*() (isdigit, isblank, ...) и toupper() и tolower()
    if (isxdigit((unsigned char)ch)) { /* ... */ }
  • (Если я запомню больше, я добавлю их сюда)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...