2010-06-22 14 views
30

he leído de un libro sobre el defination tentativa de que,definición tentativa

A tentative definition is any external data declaration that has no storage class specifier and no initializer. A tentative definition becomes a full definition if the end of the translation unit is reached and no definition has appeared with an initializer for the identifier

explicar qué significa la afirmación anterior. Además, ¿la diferencia entre Declaración y Definición? Me confundí debido a esto. :( Y por qué no este programa da un error:

#include<stdio.h> 
int a;  //Tentative definition 
int a;  //similarly this declaration too. 
int main() //not getting any error with this code why its so? 
{ 
    printf("hi"); 
} 

Además, lo que está mal con este código:

#include<stdio.h> 
printf("Hi"); 
int main(void){ 
    return 0; 
} 
+1

¿En qué libro leyó sobre la definición tentativa? – Destructor

Respuesta

55

Una variable declara dice, "hay una variable con el siguiente nombre y tipo en el programa".

Una variable definición dice: "Estimado Sr. Compilador, asigne memoria para una variable con el siguiente nombre y tipo ahora".

Por lo tanto, puede haber varias declaraciones para la misma variable, pero solo debe haber una definición.

En C, las declaraciones puras (que no son también definiciones) van precedidas de la palabra clave extern. Entonces, como no tiene esta palabra clave en su primer ejemplo, lo que tiene son dos definiciones. Aparentemente, esto parece ser un problema (y de hecho es un error en C++), pero C tiene una regla especial de "definición provisional" que permite múltiples definiciones para la misma variable siempre que coincidan y como máximo con una tiene un inicializador El compilador de C, entre bastidores, combina todas las definiciones tentativas en una sola definición.

Tenía que ha intentado iniciar ambas definiciones, así:

int a = 1; 
int a = 2; 

entonces habría habido un error.

Su segunda pregunta es más sencilla. En C, simplemente no puede tener instrucciones ejecutables fuera del cuerpo de una función. Simplemente no está permitido. Piénselo: ¿cuándo esperaría que se ejecutara si estuviera permitido?

+0

@TylerMcHenry: es ilegal tanto en C como en C++, pero los compiladores de C implementan esto como una extensión común. Ver [esta respuesta] (http://stackoverflow.com/a/6371156/183120). – legends2k

+4

@ legends2k No, esto no es ilegal en C ... en la pregunta a la que se vincula (y también la pregunta de que la respuesta a la que vincula a los enlaces) involucra varios archivos. Las definiciones tentativas múltiples (compatibles) en el mismo archivo no son una infracción. La violación en esa pregunta se debe a que, al final de la unidad de traducción, si hay definiciones provisionales sin una definición completa, se implica una definición completa.Eso además de múltiples archivos conduce a múltiples definiciones en el tiempo de enlace (a excepción de la extensión común de las reglas de definición provisional para abarcar varios archivos). –

+0

¿Por qué solo es legal con variables globales, no con variables locales? Con variables locales, ¿da error de redeclaración? –

8

Los primeros trabajos debido tanto a sus definiciones de a son tentativas, lo cual puede duplicarse con la frecuencia que considere adecuada. Al final de la unidad de traducción, no se ha visto ninguna definición no tentativa, por lo que lo que ha especificado para los atributos se combina con los valores predeterminados para obtener una definición final de a, por lo que Tendremos una conexión externa, una duración de almacenamiento estática y se inicializará a 0.

El problema con el segundo no tiene nada que ver con las definiciones tentativas. Su printf("Hi"); necesita estar dentro de una función para funcionar, no es una declaración o una definición (provisional o de otro tipo); simplemente no está permitido allí.