world tuto program first cpp c++ c compiler-construction

tuto - ¿Por qué C necesita la palabra clave "struct" y no C++?



program c++ (6)

Así es como se ve C Por lo tanto, los siguientes patrones son bastante comunes en C:

typedef struct YourStructure { int x; // more fields } YourStructure;

Entonces puede hacer referencia de la misma manera que en C ++.

Siempre he estado un poco confundido sobre lo que está pasando aquí:

#include <stdio.h> int main() { timeval tv; tv.tv_sec = 1; for (;;) { select(0, 0, 0, 0, &tv); printf("%s/n", "Hello World!"); } }

Lo siento si eso no se compila, simplemente lo escribió como un ejemplo rápido.

Un código como este no se compilará en gcc a menos que agregue la palabra clave struct antes del uso de struct timeval. g ++ por otro lado maneja bien como está.

¿Es esto una diferencia entre cómo manejan C y C ++ las estructuras o es solo una diferencia en los compiladores? (Estoy muy orientado a C ++, y el uso de struct en C en líneas como esta siempre me ha desconcertado un poco).


Considere la idea original de C ++ (o, cuando era solo una idea, "C con clases"), la de un lenguaje orientado a OO que era compatible con C hasta el punto donde la mayoría de los programas C válidos también eran programas C ++ válidos.

C ++ construyó su modelo de clase comenzando con la struct de C y agregando alguna funcionalidad adicional:

  1. Herencia (aunque puede acercarse en C teniendo el primer miembro de una estructura de la estructura de la que quiere "heredar").
  2. Ocultamiento de información (a través de public , private , etc.)
  3. Métodos de miembros (que originalmente fueron convertidos por macros en código C fuera de la estructura con un parámetro agregado, muchas implementaciones son similares en la práctica).

En este punto hubo dos problemas. La primera es que el acceso por defecto tenía que ser público, ya que C no tiene información oculta y, por lo tanto, desde una perspectiva C ++ tiene todo público. Para bien OO uno debe ser privado por defecto. Esto se solucionó agregando una class que es prácticamente idéntica a struct excepto que el valor predeterminado es private lugar de public .

La otra es que esta perspectiva OO debe tener timeval o cualquier otra clase / estructura en la misma "base" que int o char , en lugar de anotar constantemente en el código como especial. Esto se resolvió relajando la regla de que uno debe colocar struct (o class ) antes del nombre del tipo al declarar una variable de ese tipo. Por lo tanto, struct timeval tv puede convertirse en timeval tv .

Esto luego influyó en los lenguajes OO de sintaxis C posteriores, como Java y C # hasta el punto donde, por ejemplo, solo la forma más corta ( timeval tv ) sería una sintaxis válida en C #.


Diría que es una decisión de diseño de ambos idiomas.

Las estructuras en C son solo registros estructurados y tienen un uso diferente al tipo incorporado.

C ++ tiene ctors y sobrecargas de operadores, por lo que actúan como tipos.

struct foo x; // create a structure of pattern foo typedef foo foo_type; // "define" a type foo_type x; // create an instance of type foo_type

C ++:

foo x; // create an instance of type foo

Como nota al margen, struct foo todavía está permitido en C ++. struct foo es más fácil de analizar y luego typedef''d foo ya que la búsqueda de nombre es más simple.


Es simplemente una diferencia en los idiomas. C ++ es más permisivo en su sintaxis struct.


La forma en que lo hace C fue primero, por supuesto. Las estructuras y las clases en C ++ son casi idénticas, y hubiera sido muy inconveniente requerir una class con cada variable de clase, por lo que se simplificó para ambas.


Sintácticamente, ambos tratan a struct casi de la misma manera. Solo C ++ ha agregado una regla adicional que permite omitir la palabra clave struct (y class ) si no hay ambigüedad.

Si hay ambigüedad, también C ++ requiere la palabra clave struct en algunos lugares. Un ejemplo notorio es stat en sistemas POSIX donde hay una struct stat y una función stat .