"Долго" все еще полезно в C?
- Теперь это не самый большой целочисленный тип, который "длинный".
- Это не тип фиксированной ширины: он 32 бита на некоторых платформах и 64 на других.
- Это не обязательно такой же размер, как указатель (например, в 64-разрядной Windows)
Итак, "долго" имеет смысл? Есть ли причина объявлять длинный, а не ptrdiff_t или int64_t?
Ответы
Ответ 1
Там тонкая разница между still useful
и something you should habitually use
. Тип long
по-прежнему процветает, поскольку заметил Крис Лутц за многими системными и платформенными типами (хотя обычно это как без знака).
Когда вы знаете, что данные, с которыми вы будете работать, всегда будут соответствовать этому типу (желательно, лучше, если вы также знаете подпись), нет особых причин не использовать его, особенно если у вас ограниченное пространство в структуру для работы.
Однако в большинстве случаев для будущих сопровождающих его гораздо лучше использовать intxx_t или uintxx_t, где это возможно. Например, вы не знаете, что дата эпохи UNIX всегда будет помещаться в unsigned long на 32-битных платформах (следовательно, time_t), если только у вас нет хороших полномочий, которые мир закончит, прежде чем он перевернется:)
Ответ 2
Есть ли причина объявлять длинную, а не ptrdiff_t или int64_t?
В тех случаях никогда не было. Если вы хотите разницу указателей или специально 64-битное значение, вы должны использовать ptrdiff_t
или int64_t
. Вы никогда не должны использовать long
в первую очередь, за исключением, возможно, за платформой-зависимой typedef
.
Вы должны использовать long
, когда вам нужно хотя бы 32-битное целое число, потому что int
гарантируется как минимум на 16 бит. Если вам нужен собственный тип, но вам нужно как минимум 32 бита, используйте long
. Если 16-битное ограничение допустимо на некоторых старых платформах (что, вероятно, не имеет значения, и ваш код, вероятно, никогда не будет скомпилирован), это не имеет особого значения.