Considere el siguiente código "C":
#include<stdio.h>
main()
{
printf("func:%d",Func_i());
}
Func_i()
{
int i=3;
return i;
}
Func_i()
se define al final del código fuente y no se proporciona ninguna declaración antes de su uso en main()
. En el mismo momento en que el compilador ve Func_i()
en main()
, sale de la main()
y se entera Func_i()
. El compilador de alguna manera encuentra el valor devuelto por Func_i()
y se lo da printf()
. También sé que el compilador no puede encontrar el tipo de retorno de Func_i()
. Por defecto, toma (¿adivina?) El tipo de retorno de Func_i()
ser int
. Es decir, si el código tuviera float Func_i()
entonces el compilador daría el error: Tipos conflictivos paraFunc_i()
.
De la discusión anterior vemos que:
El compilador puede encontrar el valor devuelto por
Func_i()
.- Si el compilador puede encontrar el valor devuelto al
Func_i()
salirmain()
y buscar el código fuente, entonces ¿por qué no puede encontrar el tipo de Func_i (), que se menciona explícitamente ?
- Si el compilador puede encontrar el valor devuelto al
El compilador debe saber que
Func_i()
es de tipo flotante, es por eso que da el error de tipos en conflicto.
- Si el compilador sabe que
Func_i
es de tipo flotante, ¿por qué sigue suponiendoFunc_i()
que es de tipo int y da el error de tipos en conflicto? ¿Por qué no hace forzosamenteFunc_i()
ser de tipo flotante?
Tengo la misma duda con la declaración de variable . Considere el siguiente código "C":
#include<stdio.h>
main()
{
/* [extern int Data_i;]--omitted the declaration */
printf("func:%d and Var:%d",Func_i(),Data_i);
}
Func_i()
{
int i=3;
return i;
}
int Data_i=4;
El compilador da el error: 'Data_i' no declarado (primer uso en esta función).
- Cuando el compilador ve
Func_i()
, baja al código fuente para encontrar el valor devuelto por Func_ (). ¿Por qué el compilador no puede hacer lo mismo para la variable Data_i?
Editar:
No conozco los detalles del funcionamiento interno del compilador, ensamblador, procesador, etc. La idea básica de mi pregunta es que si por fin digo (escribo) el valor de retorno de la función en el código fuente, después del uso de esa función, entonces el lenguaje "C" permite que la computadora encuentre ese valor sin dar ningún error. Ahora, ¿por qué la computadora no puede encontrar el tipo de manera similar? ¿Por qué no se puede encontrar el tipo de Data_i como se encontró el valor de retorno de Func_i ()? Incluso si uso la extern data-type identifier;
declaración, no estoy diciendo que el valor sea devuelto por ese identificador (función / variable). Si la computadora puede encontrar ese valor, ¿por qué no puede encontrar el tipo? ¿Por qué necesitamos la declaración adelantada?
Gracias.
Func_i
inválido. Nunca hubo una regla para declarar implícitamente variables indefinidas, por lo que el segundo fragmento siempre estaba mal formado. (Sí, los compiladores todavía aceptan la primera muestra porque era válida, si era descuidada, según C89 / C90.)