Ниже приведены некоторые рекомендации по использованию целочисленных типов в исходном коде Emacs на C. Эти рекомендации иногда могут противоречить друг другу; рекомендуется руководствоваться здравым смыслом.
int len = strlen (s);, если только длина s по другим причинам не должна помещаться в диапазон int.
size_t вместо ptrdiff_t, или uintptr_t вместо intptr_t).
int для кодов символов Emacs, которые находятся в диапазоне 0 .. 0x3FFFFF. В более общем случае отдавайте предпочтение int для целых чисел, заведомо находящихся в диапазоне int, например, для счетчиков столбцов экрана.
ptrdiff_t для размеров, т.е. для целых чисел, ограниченных максимальным размером любого отдельного объекта C или максимальным числом элементов в любом массиве C. Это соответствует общей предпочтительности знаковых типов в Emacs. Использование ptrdiff_t ограничивает объекты PTRDIFF_MAX байтами, но более крупные объекты в любом случае создали бы проблемы, поскольку нарушили бы вычитание указателей, так что это не налагает произвольного ограничения.
ssize_t, за исключением случаев взаимодействия с низкоуровневыми API, которые имеют ограничения, связанные с ssize_t. Хотя на типичных платформах этот тип эквивалентен ptrdiff_t, ssize_t иногда бывает уже, поэтому его использование в вычислениях, связанных с размерами, может привести к переполнению. Кроме того, ptrdiff_t более распространен, лучше стандартизирован, имеет стандартные форматы для printf и является основой для внутренней проверки переполнения размера в Emacs. При использовании ssize_t учтите, что POSIX требует поддержки только значений в диапазоне −1 .. SSIZE_MAX.
intptr_t для внутренних представлений указателей или для целых чисел, ограниченных только количеством объектов, которые могут существовать в любой момент времени, или общим количеством байтов, которые могут быть выделены. Однако для представления арифметики указателей, которая может пересекать границы страниц, предпочтительнее uintptr_t. Например, на машине с 32-разрядным адресным пространством массив может пересекать границу 0x7fffffff/0x80000000, что вызовет целочисленное переполнение при прибавлении 1 к (intptr_t) 0x7fffffff.
EMACS_INT для представления значений, преобразуемых в фикснумы Emacs Lisp или из них, поскольку арифметика фикснумов основана на EMACS_INT.
off_t, time_t). Не предполагайте, что системный тип является знаковым, если только эта уверенность не является обоснованной. Например, хотя off_t всегда знаковый, time_t таковым быть не обязан.
intmax_t для представления значений, которые могут быть любыми знаковыми целыми. Функция семейства printf может выводить такое значение через формат, например "%"PRIdMAX.
bool, false и true для логических значений. Использование bool может облегчить чтение программ и немного ускорить их работу по сравнению с использованием int. Хотя также допустимо использовать int, 0 и 1, этот более старый стиль постепенно выводится из употребления. При использовании bool учитывайте ограничения заменяющей реализации bool. В частности, логические битовые поля должны иметь тип bool_bf, а не bool, чтобы они корректно работали даже при компиляции Objective C с использованием стандартного GCC.
unsigned int или signed int вместо int, так как int менее переносим: он может быть знаковым, а может и не быть. Однобитовые битовые поля должны иметь тип unsigned int или bool_bf, чтобы их значения были 0 или 1.