renta declaracion c gcc struct

renta - declaracion



¿Qué tipo de declaración es esta? (2)

Extendiendo de esta question

Estoy teniendo problemas para entender este código.

struct foo myfoo; // --> Is it forward declaration or object creation. ? struct foo { int a; }; int main() { return 0; }

En el código marcado con la flecha --> ¿Es la declaración directa o la creación del objeto? ?

Si eso es una declaración directa, entonces ¿qué es struct foo; llamado ? Si es creación o creación de instancias de objetos, entonces, ¿cómo puede crear objetos antes de la definición de estructura?

En el compilador gcc está funcionando bien pero el otro compilador da error.

gcc -Werror -Wall tst.c -o tst

¿Alguna sugerencia o explicación sobre este comportamiento de gcc ? No podría haberlo encontrado en ningún lugar como está documentado.


Parece una definición tentativa de myfoo y debido a que la definición de la estructura se proporciona, no obtendrás ningún error.

clang proporciona un diagnóstico completo cuando el tipo no está definido.

prasoon@ats-VPCEB3AGG:~$ cat tst.c struct foo myfoo; //struct foo{ // int x ; //} ; int main() { } prasoon@ats-VPCEB3AGG:~$ clang tst.c tst.c:1:12: error: tentative definition has type ''struct foo'' that is never completed struct foo myfoo;

No creo que sea un error de gcc, Clang y Comeau Online está compilando el código.

$ 6.9.2 / 2

Una declaración de un identificador para un objeto que tiene un alcance de archivo sin un inicializador, y sin un especificador de clase de almacenamiento o con el estático del especificador de clase de almacenamiento, constituye una definición provisional. Si una unidad de traducción contiene una o más definiciones tentativas para un identificador, y la unidad de traducción no contiene una definición externa para ese identificador, entonces el comportamiento es exactamente como si la unidad de traducción contiene una declaración de alcance de archivo de ese identificador, con el tipo compuesto como del final de la unidad de traducción, con un inicializador igual a 0.


struct foo myfoo;

Esa es una definición de la variable C del tipo foo llamada myfoo . C requiere que usted declare explícitamente la struct frente a las declaraciones de variables de struct .

Ahora, su código no debe compilarse porque el compilador no tiene idea en el lugar que definió su myfoo , qué tipo de foo parece. El compilador debe quejarse de que foo sea ​​un tipo incompleto.

EDITAR:

Desechen eso, esto se llamaría una definición tentativa .