Stack Overflow en español Asked by Elblack Ninja on November 26, 2020
Pueden explicar este código si quieren:
int suma(int a, int b){
return a+b;
}
int main(){
cout<<suma(5,1)<<endl;
return 0;
}
No entiendo como C++ sabe que existe suma(int,int) y además donde está, si primero C++ ejecuta la función main()…
¡Gracias!
PD: Últimamente he estado muy perdido con las funciones… He investigado y sigo con dudas.
Me llega la pregunta vos. Si quieres la respuesta corta, el resumen esta al final. Pero creo que conocer un poco el proceso para llegar a el ejecutable te ayudara a entender la respuesta. Siempre complementa lo poquito que te digo yo aquí con unas googleadas.
Cuando tu compilas tu programa de C++, se pasa por los siguientes pasos:
Comento brevemente cada uno, siendo mas importantes los últimos 2.
Este es el que va ejecutando las instrucciones que empiezan con el #
como el #include<archivo>
que literalmente pega el archivo en el lugar. O los #define
que va sustituyendo tus macros.
Como lo dice el nombre, aquí tu programa pasa de C++ a asembler. No solo eso, sino que como comentaba @braver, se procesa el código que arriba a abajo. Aquí es donde se verán los errores. Por ejemplo, si colocabas el código de este modo:
int main(){
cout<<suma(5,1)<<endl;
return 0;
}
int suma(int a, int b){
return a+b;
}
Te hubiera tirado un error de compilacion. Va de arriba a abajo, y se topa con una funcion que no conocia, entonces tira el error. Lo que se hace es entonces decirle que existe la funcion pero sin definirla. Asi:
int suma(int a, int b);
int main(){
cout<<suma(5,1)<<endl;
return 0;
}
int suma(int a, int b){
return a+b;
}
Ahora sabe que existe, aunque cuando ve que la llamas en el main aun no sabe que es lo que hace.
Aquí el resultado será que tendremos las 2 funciones: main
y suma
En este punto va a ser código de maquina, casi listo para correr.
Este es el paso importante, y el que resuelve tu pregunta (pero no le podíamos entrar de un solo). El compilador ya conoce todas las funciones, ahora el linker va a "irlas colocando en donde tocan" (No es exactamente así, pero esta forma de verlo nos funciona).
Por eso un código como este:
int suma(int a, int b);
int main(){
cout<<suma(5,1)<<endl;
return 0;
}
Tira error hasta que llega al linker. El compilador cree que la función existe, y se espera que se tenga la implementación al llegar al linker. Como no la conoce, el linker tira un error.
No entiendo como C++ sabe que existe suma(int,int) y además donde está, si primero C++ ejecuta la función main()...
Sabe que existe ya sea cuando la defines así: int suma(int a, int b);
o cuando la implementas. Luego el linker se encarga de que el main pueda ejecutar la función suma.
Veo este comentario:
Pero, ¿Cómo C++ lee la declaración de la función si primero se ejecuta la función main()?
Y creo que mas o menos se porque la duda. El código pasa por todo un proceso antes de ser un ejecutable. No va directamente a la función main y la empieza a ejecutar, como si fuera un script. Si quieres profundizar un poco mas en como funciona, te recomiendo estos videos de The Cherno. Uno en el linker, y el otro en el compilador. Para no trabarnos en varios lugares, a veces es necesario bajar un poco el nivel de abstracción y conocer que es lo que se hace debajo del capote para resolver nuestras dudas. El lo explica bastante claro.
Correct answer by Pablochaches on November 26, 2020
Para explicarlo de una forma más sencilla es necesario entender cómo funciona C++ de la forma más básica. C++ es un lenguaje compilado, lo cual significa que es un lenguaje que hace uso de un programa (Compilador) el cual se encarga de traducir el código fuente a código binario.
El código que has formulado en la pregunta, está escrito en código fuente, el cual, el ordenador no puede comprender debido a que el ordenador habla en código maquina (unos y ceros).
Para que el ordenador pueda entender lo que se ha escrito, C++ hace uso del compilador, el cual se encarga de analizar todo el código fuente de C++. Este proceso de análisis se encarga de leer todas las funciones y variables del código fuente.
Para el compilador de C++, la lectura funciona de arriba a abajo, por lo que, para este caso, lo primero en leer es la función "suma". Después de leer la función "suma", el compilador pasa a leer la función "main", la cual, contiene en su interior la función "suma", pero esto no supone ningún problema, debido a que el Compilador ya ha leído dicha función.
Una vez leídas todas las funciones y variables, el Compilador asigna "main" como la principal función en ser ejecutada, y posteriormente devuelve un fichero en código binario, el cual contiene las instrucciones que equivalen a tu código fuente.
Este proceso asegura que cuando ejecutes dicho archivo binario, no se produzca ningún problema, debido a que, "main" ya conoce la definición de la función "suma", puesto que el Compilador se ha encargado de proporcionarle dicha definición.
Answered by DaniiLuna on November 26, 2020
C++ sabe que una que una función existe al leer una declaración: una declaración de función C++ sigue esta sintaxis:
tipo_de_retorno nombre(parámetros);
Eso crea una función llamada nombre
cuyo tipo de retorno es de tipo tipo_de_retorno
y sus parámetros son parámetros
, por ejemplo:
void hola(); // Función 'hola' que no devuelve nada.
int mundo(int x); // Función 'mundo' que devuelve un entero y recibe un entero.
Recuerda que la declaración de una función es sólo una parte del trabajo, después de declararla deberás definirla (darle cuerpo):
void hola(); // Declaración.
void hola() // Definición
{
// Cuerpo de la función.
}
Si defines una función sin declararla, la definición contará también como declaración.
Las funciones definidas se compilan y acaban escritas en una unidad de traducción (UdT), lo que se escribe en la UdT no es la función tal y como aparece en el código si no que recibe un nombre personalizado por el compilador (mangled name).
Cuando todas las funciones han sido compiladas, el enlazador enlaza todas las llamadas a la función con el código que les corresponde.
En resumen:
Answered by PaperBirdMaster on November 26, 2020
Get help from others!
Recent Answers
Recent Questions
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP