- 1
... *sizeof(uint32_t)
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+118
... *sizeof(uint32_t)
Правильно. А то вдруг кто его переопределит.
Действительно! И там случится оказия: размер uint32_t станет совсем другим!
Ну разве что кто-то ручками переопределит #define uint32_t uint64_t
Например Тарас в старых студиях ёбнет typedef int int32_t; на селероне-то всё нормально...
Лол, и как ты умудряешься выдумывать подобную пургу?
Сурово. Я бы не рискнул.
при портировании можно в лоб искать 32бит типы и смотреть надо ли их в 64бита конвертить или нет.
в случае сериализации/десереализации данных, это по моему опыту единственный работающий подход. иначе можно с легкостью сменой пары строк сломать протокол.
читаешь код и видишь, это не какая-то четверка, это размер в байтах, все понятно
А константы для кого придумали? Часто завожу просто для того чтоб код был понятней, ну и собрать числа-настройки в одном месте.
И чтоб изменить потом размер не придется по коду лазить и менять десятки этих типов. Они ведь не раз и не джва так написали.
Вполне.
А вообще интересно:
По-моему, не по стандарту:
А нолик для можно получить.
В крестах - нельзя.
Во-первых там нельзя писать безразмерные массивы int a[] в структуре (9.2-8: When an array is used as the type of a nonstatic member all dimensions shall be specified.).
Во-вторых там нельзя юзать массив нулевого размера int a[0] (8.3.4-1: If the constant-expression (5.19) is present, it shall be an integral constant expression and its value shall be greater than zero.).
В-третьих - даже sizeof() от пустой структуры вернет не менее 1 (5.3.3-2 The size of a most derived class shall be greater than zero).
То, что gcc без -pedantic не матерится на это - это гццпроблемы гццрасширение для совместимости с сишкой: warning: ISO C++ forbids zero-size array ‘a’
Все там по стандарту:
3.9.1-9: The void type is an incomplete type that cannot be completed.
5.3.3-1: The sizeof operator shall not be applied to an expression that has function or incomplete type
Ну sizeof(uint32_t) - и есть константа.
typedef же, и менять придется только в одном месте.
Угу.
что не так уж и сложно.
в противном случае, если ты делаешь сетевой протокол, то typedef'ов у тебя будет такая куча, что в почти каждой строчке кода свой уникальный тип. а это намного хуже: тривиальная ошибка - неправильный тип - на код ревью ни разу не будет найдена.
а глупым способом, когда у тебя все uint32_t или uint64_t, намного легче заметить что у какого то поля неправильный тип.
Если протокол или формат хранения - да, согласен, там из-за совместимости хуй кто поменяет типы. Да даже если и поменяют - это будет новая версия, а старую придется какое-то время поддерживать (т.е. код будет добавляться а не заменяться).
Если же размер типа не связан протоколом, а выбирается от балды - то лучше тайпдеф. Те же time_t, size_t и прочие они ведь неспроста тайпдефы.
(Я не о протоколах и форматах, с которыми совсем другая история, а о переменных).
Доктор Стертор их заминусует.
Нет. Самое лучшее - это нативный тип.
Тайпдефы - только в случае если нужна совместимость с некрософтовским компилятором, потому что у них 64бит типы через жопу.
"P.S. В 2038 году страшная кара постигнет тех, кто писал int вместо time_t."
Это мелочи. На HP-UX time_t 64бит уже ХЕЗ как давно. Но. Редкая штатная функция времени не переваривает значения времени больше INT_MAX.
Ну ладно PC, там 64 бита стремительно вытесняют 32, а вот что делать со встраиваемыми железками типа андроидов или домашних роутеров? Там 64 бита только-только начали появляться.
Опять проблема 2000x64?
Дык не надо 64-битную платформу. Надо всего лишь 64-битный time_t.
Перейти на настоящую 64-битку будет всяко сложнее.
Так что гость все правильно сказал. Другое дело, что такие платформы днем с огнем не найти. DSP какие-нибудь разве что...
Перед тем, как что-то "хоронить", нужно найти адекватную замену.
С проводника или с WMP.
Дык IE 6 закопали же, вместе с операционкой, в которой он был в комплекте.
Олсо антимонопольщики евросоюза в свое время вытрясли с M$ версию без IE и WMP - Windows N.
Тогда вот. В моем ярде - 4 фута!
Да нет больше таких платформ...
И даже те которые все еще живы, в С симулируют 8ми битные байты. Потому что иначе почти 100% софта на них не скомпилишь.
для DSP есть проприетарные языки которые из далека (и часто с близи тоже) выглядят как С, но на самом деле есть всего лишь подмножества с проприетарными расширениями и специальными семантиками. (та же фигня с FPGA/friends.)
и про POSIX в этом случае говорить не стоит, потому что (хотя я и не исключаю этой возможности) на них как правило никто операционки не использует. там народ почти все ручками пишет, с проприетарными либами производителя DSP.
#define NULL rand()
Иначе заметят