Eu vi as definições completas de struct
s em cabeçalhos e apenas declarações - há alguma vantagem em um método sobre o outro?
Se isso faz diferença, eu geralmente digitei uma estrutura como esta no .h
typedef struct s s_t;
Editar
Para ficar claro, as opções são declaração no arquivo de cabeçalho e definição na classe, ou ambas, declaração e definição no arquivo de cabeçalho. Ambos deveriam resultar na mesma usabilidade, mesmo que seja por ligação, não deveriam?
Vejo muitas quase duplicatas, por exemplo, aqui, mas nenhuma correspondência exata. Por favor, corrija-me se eu estiver errado a esse respeito.
_t
são reservados pelo POSIX, então isso geralmente é uma má ideia. Você poderia apenas fazertypedef struct toto toto
._t
uso em outros lugares (por exemplo, lighttp, linux) ... e prefixo as coisas com projident_ então, isso não deveria ser um problema, deveria?C
ish, não (com oFILE
exemplo etc). Portanto, não opaco.Respostas:
Estruturas privadas para esse arquivo devem ir no arquivo .c, com uma declaração no arquivo .h, se forem usadas por quaisquer funções no arquivo .h.
As estruturas públicas devem ir no arquivo .h.
fonte
global
elocal
visibilidade?public
não faz sentido em uma estrutura. Todas as estruturas são públicas por padrão.public
não é uma palavra-chave em C. Se você olhar a resposta de Matthew Slattery abaixo, verá como usar apenas uma declaração de encaminhamento no cabeçalho causa um erro do compilador quando o usuário tenta usar membros de um estrutura privada (opaca).Não, não quando você considera outros arquivos .c incluindo o mesmo cabeçalho. Se a definição da estrutura não estiver visível para o compilador, os detalhes dessa definição não podem ser usados. Uma declaração sem uma definição (por exemplo, apenas
struct s;
) faz com que o compilador falhe se algo tentar olhar para dentrostruct s
, enquanto ainda permite, por exemplo, compilarstruct s *foo;
(desde quefoo
não seja desreferenciado posteriormente).Compare essas versões de
api.h
eapi.c
:Este cliente da API funciona com uma das versões:
Este examina os detalhes de implementação:
que funcionará com a versão "definição no cabeçalho", mas não com a versão "definição na implementação", pois neste último caso o compilador não tem visibilidade do layout da estrutura:
Portanto, a versão "definição na implementação" protege contra o uso indevido acidental ou deliberado de detalhes de implementação privados.
fonte
dereferencing pointer to incomplete type
foi exatamente o meu caso!Se a estrutura for usada por outras unidades de compilação (arquivos .c), coloque-a no arquivo de cabeçalho para que possa incluí-lo sempre que necessário.
Se a estrutura for usada apenas em uma unidade de compilação (arquivo .c), coloque-a nesse arquivo .c.
fonte
O ponto é, colocá-lo em um arquivo de cabeçalho permite que você use a estrutura (ou qualquer outra definição) de vários arquivos de origem, apenas incluindo esse arquivo de cabeçalho.
Mas se você tiver certeza de que ele só será usado a partir de um arquivo de origem, isso realmente não fará nenhuma diferença.
fonte
Eu os coloquei no arquivo C para torná-lo mais orientado a objetos, consulte este artigo .
fonte
Geralmente, não acho que faça uma grande diferença colocá-los no cabeçalho ou nos arquivos de origem. No entanto, se você precisar acessar os membros de uma estrutura de vários arquivos de origem, é mais fácil colocar a estrutura em um arquivo de cabeçalho e incluí-lo de quaisquer outros arquivos em que a estrutura seja necessária.
fonte