Parece uma pergunta simples, mas não consigo encontrá-la na pesquisa Stack Overflow ou no Google. O que um tipo seguido por uma _t
média? Tal como
int_t anInt;
Eu vejo muito isso no código C destinado a lidar de perto com o hardware - não posso deixar de pensar que eles estão relacionados.
c
naming-conventions
types
Kevin Griffin
fonte
fonte
int_t
definido? Se é sempre definido comoint
, não é útil; é muito mais claro usarint
diretamente. Se nem sempre é definido comoint
(digamos, se poderia serlong int
oushort int
), então é um nome mal escolhido e confuso.Respostas:
Como Douglas Mayle observou, basicamente denota um nome de tipo. Consequentemente, seria desaconselhável terminar com nomes de variáveis ou funções com '
_t
', pois isso pode causar alguma confusão. Bem comosize_t
, os norma define C89wchar_t
,off_t
,ptrdiff_t
, e, provavelmente, alguns outros que eu esqueci. O padrão C99 define um monte de tipos de extras, comouintptr_t
,intmax_t
,int8_t
,uint_least16_t
,uint_fast32_t
, e assim por diante. Esses novos tipos são formalmente definidos,<stdint.h>
mas na maioria das vezes você usará o<inttypes.h>
que ( normalmente para cabeçalhos C padrão) inclui<stdint.h>
. Ele (<inttypes.h>
) também define macros para uso com oprintf()
escanf()
.Como Matt Curtis observou, não há significado para o compilador no sufixo; é uma convenção voltada para o ser humano.
No entanto, você também deve observar que o POSIX define muitos nomes de tipos extras que terminam em '
_t
' e reserva o sufixo para a implementação. Isso significa que, se você estiver trabalhando em sistemas relacionados ao POSIX, é aconselhável definir seus próprios nomes de tipo com a convenção. O sistema em que trabalho o faz (há mais de 20 anos); regularmente viajamos por sistemas que definem tipos com o mesmo nome que definimos.fonte
abbr_xxxxx_t
nomes de tipos. Sem esse prefixo, você pode ser pego a qualquer momento. Geralmente, os_t
tipos padronizados usam todas as letras minúsculas (FILE
eDIR
são duas exceções, duas vezes - todas maiúsculas e não_t
); portanto, você pode usarCamelCase_t
com segurança moderada, com ou sem as maiúsculas à esquerda. O sistema em que trabalho principalmente tende a viver perigosamente e a usar de_t
qualquer maneira, mas nos incomodou algumas vezes. Costumo usarCamelCase
sem sufixo o meu próprio trabalho; minhas funções geralmente são todas minúsculas.É uma convenção usada para nomear tipos de dados, por exemplo, com
typedef
:fonte
O
_t
geralmente envolve uma definição de tipo opaco.O GCC apenas adiciona nomes que terminam com
_t
o espaço para nome reservado que você não pode usar, para evitar conflitos com versões futuras do Standard C e POSIX (manual da biblioteca GNU C) . Após algumas pesquisas, finalmente encontrei a referência correta dentro do padrão POSIX (1003.1, Justificativa (Informativa)):Em poucas palavras, o Padrão diz que há boas chances de estender a lista de tipos de Padrão; portanto, o Padrão restringe o
_t
espaço de nome para seu próprio uso.Por exemplo, seu programa corresponde ao POSIX 1003.1 Edições 6 e você definiu um tipo
foo_t
. O POSIX 1003.1 Edições 7 é finalmente lançado com um tipo recém-definidofoo_t
. Seu programa não corresponde à nova versão, o que pode ser um problema. A restrição do_t
uso impede a refatoração do código. Portanto, se você busca uma conformidade com POSIX, deve definitivamente evitar o_t
que o Padrão declara.Nota lateral: pessoalmente, eu tento manter o POSIX porque acho que ele fornece bons conceitos básicos para uma programação limpa. Além disso, gosto bastante das diretrizes do Linux Coding Style (capítulo 5) . Existem algumas boas razões para não usar o typedef. Espero que esta ajuda!
fonte
É uma convenção de nomenclatura padrão para tipos de dados, geralmente definida por typedefs. Muitos códigos C que lidam com registros de hardware usam nomes padrão definidos por C99 para tipos de dados de tamanho fixo assinados e não assinados. Como convenção, esses nomes estão em um arquivo de cabeçalho padrão (stdint.h) e terminam com _t.
fonte
É apenas uma convenção que significa "tipo". Isso não significa nada de especial para o compilador.
fonte
O
_t
não possui inerentemente nenhum significado especial. Mas caiu em uso comum adicionar o_t
sufixo aos typedef's.Você pode estar mais familiarizado com práticas comuns de C para nomeação de variáveis ... Isso é semelhante a como é comum colocar ap na frente de um ponteiro e usar um sublinhado na frente de variáveis globais (isso é um pouco menos comum) e usar os nomes de variáveis
i
,j
ek
para as variáveis de loop temporários.No código em que o tamanho e a ordem das palavras são importantes, é muito comum usar tipos definidos personalizados que são explícitos, como
BYTE
WORD
(normalmente 16 bits)DWORD
(32 bits).int_t
não é tão bom, porque a definição deint
varia entre plataformas - então de quemint
você está em conformidade? (Embora, atualmente, a maioria dos desenvolvimentos centrados em PC trate-o como 32 bits, muitas coisas para desenvolvimento não-PC ainda tratam int's como 16 bits).fonte
Isso significa tipo.
size_t
é o tipo de tamanho.fonte
Houve algumas boas explicações sobre o assunto. Apenas para adicionar outro motivo para redefinir os tipos:
Em muitos projetos incorporados, todos os tipos são redefinidos para indicar corretamente o tamanho especificado para os tipos e melhorar a portabilidade em diferentes plataformas (por exemplo, compiladores de tipos de hardware).
Outro motivo será tornar seu código portátil em diferentes sistemas operacionais e evitar colisões com tipos existentes no sistema operacional que você está integrando ao seu código. Para isso, geralmente é adicionado um prefixo exclusivo (quanto possível).
Exemplo:
fonte
Se você estiver lidando com código de interface de hardware, o autor do código que você está visualizando pode ter definido
int_t
como um número inteiro de tamanho específico. O padrão C não atribui um tamanho específico aoint
tipo (depende do seu compilador e plataforma de destino, potencialmente), e o uso de umint_t
tipo específico evitaria esse problema de portabilidade.Essa é uma consideração particularmente importante para o código da interface de hardware, e pode ser por isso que você notou a convenção pela primeira vez.
fonte
Por exemplo, em C99, /usr/include/stdint.h:
_t
sempre significa definido por typedef.fonte