"Долго" все еще полезно в 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-битное ограничение допустимо на некоторых старых платформах (что, вероятно, не имеет значения, и ваш код, вероятно, никогда не будет скомпилирован), это не имеет особого значения.