utilizando la palabra clave struct en la statement de variables en C ++

Tengo la sensación de que esto puede estar relacionado con la syntax C, pero comencé mi vida de progtwigción con C ++, así que no estoy seguro.

Básicamente, he visto esto:

struct tm t; memset( &t, 0, sizeof(struct tm) ); 

Estoy un poco confundido con esta syntax, ya que normalmente esperaría que lo anterior se viera así:

 tm t; memset( &t, 0, sizeof(tm) ); 

¿Cuál es la diferencia entre los dos y por qué se usa el primero en su lugar?

Actualizar

La estructura tm que me refiero está en wchar.h , y la definición es la siguiente:

 struct tm { int tm_sec; /* seconds after the minute - [0,59] */ int tm_min; /* minutes after the hour - [0,59] */ int tm_hour; /* hours since midnight - [0,23] */ int tm_mday; /* day of the month - [1,31] */ int tm_mon; /* months since January - [0,11] */ int tm_year; /* years since 1900 */ int tm_wday; /* days since Sunday - [0,6] */ int tm_yday; /* days since January 1 - [0,365] */ int tm_isdst; /* daylight savings time flag */ }; 

La respuesta simple es que la palabra clave struct allí está presente para restringir la búsqueda del identificador tm a solo tipos de clases definidos por el usuario . Probablemente se deje para compatibilidad con C, donde se requiere.

Al contrario de lo que dicen otros, no existe el autodefinado tipo, ni C y C ++ difieren con respecto a cómo se administran los identificadores para los tipos definidos por el usuario. La única diferencia es en la búsqueda.

Puedes leer más aquí

En C, los nombres de etiqueta struct no forman identificadores en el espacio de nombre global

 struct not_a_global_identifier { /* ... */ }; 

Para referirse a esa estructura, debe usar la palabra clave struct (para especificar el espacio de nombre)

 struct not_a_global_identifer object; 

o crea un nuevo identificador, en el espacio de nombre global, con typedef

 typedef struct not_a_global_identifer { /* ... */ } global_name_space_identifier; 

Hay 4 espacios de nombres en C, ver 6.2.3 en el estándar C99 :

  • nombres de tags
  • las tags de estructuras, uniones y enumeraciones
  • los miembros de estructuras o uniones (ni un solo espacio de nombre … se definen tantas estructuras o uniones)
  • espacio de nombre global , para todos los demás identificadores

Este es un progtwig legal de C 🙂

 int main(void) { typedef struct foobar { int foobar; } foobar; foobar boo; boo.foobar = 42; if (boo.foobar) goto foobar; foobar: return 0; } 

Usando struct tm t; es por compatibilidad con C, en el que declarar una estructura llamada ” tm ” define un tipo llamado ” struct tm ” pero no uno llamado ” tm ” (en oposición a C ++, en el que se declaran ambos nombres para el tipo).

Los tipos definidos por el usuario tienen su propio espacio identificador, es decir, cuando el comstackdor analiza el archivo almacena cada identificador en su espacio correspondiente.

Cuando se refiere a tm , el comstackdor de C (como el de C ++) buscará este identificador en el espacio de identificador global. El comstackdor C ++ buscará en el espacio identificador de tipos definidos por el usuario si no hubiera encontrado antes el símbolo.

Básicamente, si quiere tener el mismo comportamiento que en C ++, agregue esta línea:

 typedef struct tm tm; 

Puede combinar struct declaration y typedef así:

 typedef struct tm { int field } tm; 

O usando una estructura anónima:

 typedef struct { int field } tm; 

El mismo comportamiento aplica para enum y union :

 typedef enum { VALUE } myEnum; typedef union { int integer; char charArray[4]; } myUnion; 

En su ejemplo, tm puede haber sido una estructura tipo escrita.

p.ej

 typedef struct tm_t { int x; }tm; 

y luego puedes hacer

 tm t; 

Puede ver la referencia vinculada a continuación y citando desde allí “En C, debe usar explícitamente la palabra clave struct para declarar una estructura. En C ++, esto no es necesario una vez que se haya definido el tipo”. Vea el enlace para más información y ejemplos.

http://msdn.microsoft.com/en-us/library/64973255%28v=vs.80%29.aspx