Это кажется простым вопросом, но я не могу найти его с помощью поиска переполнения стека или Google. Что означает тип, за которым следует _t
среднее? Такие как
int_t anInt;
Я вижу, что многое в коде C предназначено для тесного взаимодействия с оборудованием - я не могу не думать, что они связаны между собой.
c
naming-conventions
types
Кевин Гриффин
источник
источник
int_t
определяется? Если это всегда определено какint
, это не полезно; гораздо понятнее использоватьint
напрямую. Если это не всегда определяется какint
(скажем, если это может бытьlong int
илиshort int
), то это плохо выбранное и запутанное имя.Ответы:
Как отметил Дуглас Мейл, это в основном обозначает имя типа. Следовательно, вам не рекомендуется заканчивать имена переменных или функций символом '
_t
', поскольку это может вызвать некоторую путаницу. А такжеsize_t
, стандарт определяет C89wchar_t
,off_t
,ptrdiff_t
, и , возможно , некоторые другие , которые я забыл. Стандарт C99 определяет множество дополнительных типов, такие какuintptr_t
,intmax_t
,int8_t
,uint_least16_t
,uint_fast32_t
, и так далее. Эти новые типы формально определены в,<stdint.h>
но чаще всего вы будете использовать,<inttypes.h>
который (необычно для стандартных заголовков Си) включает<stdint.h>
. Он (<inttypes.h>
) также определяет макросы для использования сprintf()
иscanf()
.Как заметил Мэтт Кертис, в суффиксе нет никакого значения для компилятора; это ориентированная на человека конвенция.
Однако следует также отметить, что POSIX определяет множество дополнительных имен типов, заканчивающихся на '
_t
', и резервирует суффикс для реализации. Это означает, что если вы работаете в системах, связанных с POSIX, определение собственных имен типов с помощью соглашения не рекомендуется. Система, над которой я работаю, сделала это (более 20 лет); мы регулярно сталкиваемся с системами, определяющими типы с тем же именем, что и мы.источник
abbr_xxxxx_t
имена типов. Без такого префикса вас могут поймать в любое время. Как правило, стандартизированные_t
типы используют все строчные буквы (FILE
иDIR
являются двумя исключениями, дважды - все заглавные буквы, и нет_t
), так что вы можете использовать ихCamelCase_t
с умеренной безопасностью, с начальными заглавными буквами или без них. Система, над которой я в основном работаю, имеет тенденцию жить опасно и, в_t
любом случае, использовать ее , но иногда она укусила нас. Я склонен использоватьCamelCase
без суффикса для моей собственной работы; мои функции обычно все в нижнем регистре.Это соглашение используется для именования типов данных, например
typedef
:источник
_t
Обычно оборачивает непрозрачное определение типа.GCC просто добавляет имена, оканчивающиеся
_t
на зарезервированное пространство имен, которое вы не можете использовать, чтобы избежать конфликтов с будущими версиями Standard C и POSIX (руководство по библиотеке GNU C) . После некоторых исследований я наконец нашел правильную ссылку в стандарте POSIX (1003.1, Обоснование (информативное)):В двух словах, Стандарт говорит, что есть хорошие шансы на расширение списка типов Стандартов, поэтому Стандарт ограничивает
_t
пространство имен для собственного использования.Например, ваша программа соответствует POSIX 1003.1 Issues 6, и вы определили тип
foo_t
. POSIX 1003.1 Проблемы 7 в конечном итоге выпущены с новым определенным типомfoo_t
. Ваша программа не соответствует новой версии, что может быть проблемой. Ограничение_t
использования предотвращает рефакторинг кода. Таким образом, если вы стремитесь к соответствию POSIX, вам определенно следует избегать того,_t
что указано в Стандарте.Примечание: лично я стараюсь придерживаться POSIX, потому что я думаю, что он дает хорошие основы для чистого программирования. Более того, мне очень нравятся рекомендации по стилю кодирования Linux (глава 5) . Есть несколько веских причин, почему не использовать typedef. Надеюсь, это поможет!
источник
Это стандартное соглашение об именах для типов данных, обычно определяемое с помощью typedefs. Большая часть кода C, который работает с аппаратными регистрами, использует стандартные имена, определенные C99, для типов данных со знаком и без знака фиксированного размера. Как правило, эти имена находятся в стандартном заголовочном файле (stdint.h) и заканчиваются на _t.
источник
Это просто соглашение, которое означает «тип». Это ничего не значит для компилятора.
источник
По
_t
сути, не имеет никакого особого значения. Но это стало обычным делом для добавления_t
суффикса к typedef.Возможно, вы более знакомы с распространенными практиками C для именования переменных ... Это похоже на то, как обычно указатель в начале указателя и использование подчеркивания перед глобальными переменными (это немного реже) и использовать имена переменных
i
,j
иk
для переменных временных циклов.В коде, где важны размер слова и порядок, очень часто используются явно определенные типы, например
BYTE
WORD
(обычно 16-битные)DWORD
(32- битные ).int_t
это не так хорошо, потому что определениеint
варьируется между платформами - так,int
кому вы соответствуете? (Хотя в наши дни большинство разработок, ориентированных на ПК, рассматривают его как 32-битные, многие вещи для разработки, не относящиеся к ПК, по-прежнему рассматривают int как 16-битные).источник
Это значит тип.
size_t
это тип размера.источник
Было несколько хороших объяснений по этому вопросу. Просто чтобы добавить еще одну причину для переопределения типов:
Во многих встраиваемых проектах все типы переопределяются для правильного определения заданного размера для типов и для улучшения переносимости между различными платформами (например, компиляторами типов оборудования).
Другой причиной будет сделать ваш код переносимым между различными ОС и избежать конфликтов с существующими типами в ОС, которые вы интегрируете в свой код. Для этого обычно добавляется уникальный (насколько это возможно) префикс.
Пример:
источник
Если вы имеете дело с кодом аппаратного интерфейса, автор кода, который вы просматриваете, может быть определен
int_t
как целое число определенного размера. Стандарт C не назначает конкретный размерint
типу (возможно, это зависит от вашего компилятора и целевой платформы), и использование определенногоint_t
типа позволит избежать этой проблемы переносимости.Это особенно важно для кода аппаратного интерфейса, поэтому, возможно, вы впервые заметили здесь соглашение.
источник
Например, в C99 /usr/include/stdint.h:
_t
всегда означает определенный typedef.источник