Spec-Zone.ru › Elisp

Типы целых чисел C

Вот несколько рекомендаций по использованию целочисленных типов в исходном коде Emacs C. Эти рекомендации иногда дают противоречивые советы; рекомендуется проявлять здравый смысл.

  • Избегайте произвольных ограничений. Например, избегайте int len = strlen (s);, если длина s не требуется по другим причинам для размещения в диапазоне int.
  • Не предполагайте, что арифметика со знаковыми целыми числами переполняется при переполнении. Это больше не относится к целевым платформам Emacs: переполнение знакового целого числа в действительности имеет неопределенное поведение и может привести к выводу ядра или даже к нелогичному поведению кода раньше или позже. Переполнение беззнакового целого числа надежно переполняется по модулю степени двойки.
  • Предпочитайте знакомые типы беззнаковым, так как код становится запутанным, когда знакомые и беззнаковые типы сочетаются. Многие другие рекомендации предполагают, что типы знакомые; в более редких случаях, когда необходимы беззнаковые типы, могут применяться аналогичные рекомендации для беззнаковых аналогов (например, 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 тип EMACS_INT для представления значений, преобразованных в или из fixnum Emacs Lisp, так как арифметика fixnum основана на EMACS_INT.
  • При представлении системного значения (например, размера файла или количества секунд с момента эпохи) предпочтительнее соответствующий системный тип (например, off_t, time_t). Не предполагайте, что системный тип является знаковым, если эта предположение не известно, что безопасно. Например, хотя off_t всегда знаком, time_t может и не быть.
  • Предпочитайте intmax_t для представления значений, которые могут быть любым знаковым целым числом. Функция семейства printf может вывести такое значение с помощью формата, такого как "%"PRIdMAX.
  • Предпочитайте bool, false и true для булевых значений. Использование bool может сделать программы более читаемыми и немного быстрее, чем использование int. Хотя использование int, 0 и 1 также допустимо, этот более старый стиль постепенно отменяется. При использовании bool, учитывайте ограничения реализации замены bool, как документировано в файле исходного кода lib/stdbool.in.h. В частности, битовые поля булевых значений должны быть типа bool_bf, а не bool, чтобы они работали правильно даже при компиляции Objective C с стандартным GCC.
  • В битовых полях предпочтительнее unsigned int или signed int вместо int, так как int менее портативен: он может быть знаковым и может не быть. Однобитовые битовые поля должны быть unsigned int или bool_bf, чтобы их значения были 0 или 1.

Copyright © 1990-1996, 1998-2022 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/C-Integer-Types.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API