Introdução: Por que os iniciantes se confundem com struct e typedef struct?
\n\nSe você já deu uma olhada no Stack Overflow em busca de uma resposta para a pergunta "Difference between 'struct' and 'typedef struct' in C++?", certamente notou que este tópico acumulou milhares de visualizações. E isso não é por acaso. Muitos desenvolvedores C++ iniciantes, especialmente aqueles que vieram do mundo C ou que leem livros antigos, se deparam com uma sintaxe estranha com typedef struct e ficam genuinamente confusos: por que escrever uma palavra extra se podemos simplesmente escrever struct?
Neste artigo, vamos esclarecer de uma vez por todas qual é a diferença entre struct e typedef struct no C++ moderno. Vamos analisar as raízes históricas dessa confusão, escrever alguns exemplos de código e dar recomendações claras sobre como escrever corretamente. Vamos lá!
O que é struct em C++?
\n\nVamos começar pelo básico. Uma estrutura (struct) em C++ é um tipo de dado definido pelo usuário que agrupa várias variáveis (campos) sob um único nome. Ao contrário de uma classe, todos os membros de uma estrutura têm, por padrão, o modificador de acesso public, mas, fora isso, struct e class em C++ são praticamente idênticos (sim, uma estrutura pode ter métodos, construtores e até herança).
A declaração de uma estrutura no C++ moderno é assim:
\n\n// Estrutura simples\nstruct Point {\n int x;\n int y;\n};\n\nint main() {\n Point p1; // OK: criando um objeto\n p1.x = 10;\n p1.y = 20;\n return 0;\n}\n\nTudo simples e elegante. Mas de onde vem o typedef struct?
Contexto histórico: herança da linguagem C
\n\nA questão é que, na linguagem C, para criar uma variável do seu tipo estrutural, era obrigatório escrever a palavra-chave struct antes do nome da estrutura. Por exemplo:
// Em C, assim:\nstruct Point p1; // sem a palavra struct — erro\n\nPara se livrar desse inconveniente, os programadores em C criaram um truque com typedef:
// Estilo C: typedef + struct\ntypedef struct {\n int x;\n int y;\n} Point;\n\nint main() {\n Point p1; // agora pode ser usado sem struct\n return 0;\n}\n\nEssa sintaxe cria um apelido (alias) para uma estrutura anônima. Em C, isso era muito útil. Mas em C++, tudo funciona de forma diferente.
\n\nE o typedef struct é necessário em C++?
\n\nA resposta curta é: não, não é necessário. No C++ moderno (a partir do padrão C++98 em diante), o nome da estrutura automaticamente se torna um nome de tipo. Você pode usá-lo sem a palavra-chave struct.
Compare as duas abordagens:
\n\n// Abordagem 1: C++ puro (recomendado)\nstruct Point {\n int x, y;\n};\n\nPoint p1; // OK\n\n// Abordagem 2: estilo C antigo (não recomendado)\ntypedef struct {\n int x, y;\n} Point;\n\nPoint p2; // também OK, mas para que o extra?\n\nAmbas as opções compilarão, mas a primeira é mais curta, mais clara e está de acordo com os padrões modernos de codificação. A segunda opção é apenas um hábito herdado do C.
\n\nQuando o typedef struct ainda pode ser útil?
\n\nExistem algumas situações em que typedef struct em C++ pode ser justificado:
- \n
- Código multiplataforma em C e C++. Se você está escrevendo um arquivo de cabeçalho que deve compilar tanto em C quanto em C++ (por exemplo, para uma biblioteca), é melhor usar
typedef struct— assim o código funcionará em todos os lugares. \n - Criação de apelido para um tipo complexo. Às vezes,
typedefé usado com templates ou ponteiros para estruturas, a fim de simplificar a sintaxe. \n - Compatibilidade com código legado. Se você está mantendo um projeto antigo escrito no estilo C, é melhor não quebrar o estilo existente. \n
Mas se você está escrevendo um novo projeto em C++ puro, esqueça o typedef struct.