Introducción: ¿Por qué los principiantes se confunden con struct y typedef struct?
\n\nSi alguna vez has visitado Stack Overflow buscando respuesta a la pregunta «Difference between 'struct' and 'typedef struct' in C++?», seguramente habrás notado que este tema ha acumulado miles de visitas. Y no es casualidad. Muchos desarrolladores principiantes de C++, especialmente aquellos que vienen del mundo de C o leen libros antiguos, se topan con una sintaxis extraña con typedef struct y se preguntan sinceramente: ¿por qué escribir una palabra adicional si se puede escribir simplemente struct?
En este artículo, de una vez por todas, entenderemos cuál es la diferencia entre struct y typedef struct en el C++ moderno. Veremos las raíces históricas de esta confusión, escribiremos varios ejemplos de código y daremos recomendaciones claras sobre cómo escribir correctamente. ¡Allá vamos!
¿Qué es struct en C++?
\n\nEmpecemos por lo básico. Una estructura (struct) en C++ es un tipo de dato definido por el usuario que agrupa varias variables (campos) bajo un mismo nombre. A diferencia de una clase, todos los miembros de una estructura tienen por defecto el modificador de acceso public, pero por lo demás, struct y class en C++ son prácticamente idénticos (sí, una estructura puede tener métodos, constructores e incluso herencia).
La declaración de una estructura en el C++ moderno se ve así:
\n\n// Estructura simple\nstruct Point {\n int x;\n int y;\n};\n\nint main() {\n Point p1; // OK: creamos un objeto\n p1.x = 10;\n p1.y = 20;\n return 0;\n}\n\nTodo es simple y elegante. Pero, ¿de dónde surge entonces typedef struct?
Contexto histórico: herencia del lenguaje C
\n\nEl problema es que en el lenguaje C, para crear una variable de un tipo estructurado, era obligatorio escribir la palabra clave struct antes del nombre de la estructura. Por ejemplo:
// En C así:\nstruct Point p1; // sin la palabra struct — error\n\nPara eliminar esta molestia, los programadores de C inventaron un truco con typedef:
// Estilo C: typedef + struct\ntypedef struct {\n int x;\n int y;\n} Point;\n\nint main() {\n Point p1; // ahora se puede usar sin struct\n return 0;\n}\n\nEsta sintaxis crea un alias para una estructura sin nombre. En C era muy útil. Pero en C++ todo funciona de manera diferente.
\n\n¿Se necesita typedef struct en C++?
\n\nLa respuesta corta es: no, no se necesita. En el C++ moderno (desde el estándar C++98 en adelante), el nombre de la estructura se convierte automáticamente en el nombre del tipo. Puedes usarlo sin la palabra clave struct.
Compara los dos enfoques:
\n\n// Enfoque 1: C++ puro (recomendado)\nstruct Point {\n int x, y;\n};\n\nPoint p1; // OK\n\n// Enfoque 2: estilo C anticuado (no recomendado)\ntypedef struct {\n int x, y;\n} Point;\n\nPoint p2; // también OK, pero ¿para qué lo adicional?\n\nAmbas opciones se compilarán, pero la primera es más corta, más clara y cumple con los estándares modernos de codificación. La segunda opción es simplemente un hábito heredado de C.
\n\n¿Cuándo puede ser útil typedef struct?
\n\nHay algunas situaciones en las que typedef struct en C++ puede estar justificado:
- \n
- Código multiplataforma en C y C++. Si escribes un archivo de cabecera que debe compilarse tanto en C como en C++ (por ejemplo, para una biblioteca), es mejor usar
typedef struct— así el código funcionará en todas partes. \n - Creación de un alias para un tipo complejo. A veces se usa
typedefcon plantillas o punteros a estructuras para simplificar la sintaxis. \n - Compatibilidad con código heredado. Si mantienes un proyecto antiguo escrito en estilo C, es mejor no romper el estilo existente. \n
Pero si estás escribiendo un proyecto nuevo en C++ puro, olvídate de typedef struct