Test Foro de elhacker.net SMF 2.1

Programación => Programación C/C++ => Mensaje iniciado por: Zodiak98 en 16 Junio 2013, 16:21 PM

Título: [Error] ¿Porqué no compila este simple programa?
Publicado por: Zodiak98 en 16 Junio 2013, 16:21 PM
Hola amigos, bueno este tema lo hago porqué me puse a practicar con los archivos de cabecera, pero tengo un error al compilar me sale estos 2 errores:


undefined reference to `suma(int, int)'
undefined reference to `resta(int, int)'


Acá están los archivos con las instrucciones:

Código (cpp) [Seleccionar]

//main.cpp

#include "operaciones.h"

int main()
{
    int resultadoSU = suma(4,5);
    int resultadoRE = resta(12,4);

    printf("El resultado de la suma es: %d \n",resultadoSU);
    printf("El resultado de la resta es: %d \n",resultadoRE);

    std::cin.get();

    return 0;
}


Código (cpp) [Seleccionar]

//operaciones.h

#ifndef OPERACIONES_H_INCLUDED
#define OPERACIONES_H_INCLUDED

#include <iostream>
#include <stdio.h>

int suma(int x , int y);
int resta(int x , int y);


#endif


Código (cpp) [Seleccionar]

//operaciones.cpp

#include "operaciones.h"

int suma(int x , int y){ return ( x + y ); }

int resta(int x , int y){ return ( x - y ); }


Qué estoy haciendo mal?
Título: Re: [Error] ¿Porqué no compila este simple programa?
Publicado por: 0xDani en 16 Junio 2013, 16:30 PM
El caso es que el compilador no te incluye automáticamente los archivos de implementación. Puedes probar a dejar el archivo de cabecera así:

Código (cpp) [Seleccionar]
//operaciones.h

#ifndef OPERACIONES_H_INCLUDED
#define OPERACIONES_H_INCLUDED

#include <iostream>
#include <stdio.h>

int suma(int x , int y);
int resta(int x , int y);

#include "operaciones.cpp" <--- Fijate en esto

#endif


Y quitar el include en operaciones.cpp.

Otra opción sería crear una biblioteca estática o dinámica.

Saludos.
Título: Re: [Error] ¿Porqué no compila este simple programa?
Publicado por: Zodiak98 en 16 Junio 2013, 16:44 PM
Hehe gracias me funciono. Pero he visto varios vídeos que no incluyen el archivo de implementación al final de la cabecera, y ellos utilizan Code::Blocks, que es el qué yo utilizo.
Título: Re: [Error] ¿Porqué no compila este simple programa?
Publicado por: aguml en 16 Junio 2013, 16:49 PM
A mi asi me funciona perfectamente:

#include "operaciones.h"

int main(int argc, char* argv[])
{
        int resultadoSU = suma(4,5);
        int resultadoRE = resta(12,4);

        printf("El resultado de la suma es: %d \n",resultadoSU);
        printf("El resultado de la resta es: %d \n",resultadoRE);

        getchar();

        return 0;
}


//operaciones.c

#include "operaciones.h"

int suma(int x, int y){ return ( x + y ); }

int resta(int x, int y){ return ( x - y ); }


//operaciones.h
#ifndef operacionesH
#define operacionesH
#include <stdio.h>

int suma(int x , int y);
int resta(int x , int y);
#endif


El problema es que usas una mezcla entre C y C++ mezclando archivos de C con archivos de C++. Si usas un .cpp tienes que usar un .hpp o al menos indicarlo como bien te idica el amigo o si no usa un solo tipo y no tendras problemas. Otra cosa ¿incluir iostream solo para una pausa? con lo bien que funciona getc o getchar y ya estan en stdio.h jejeje.
Título: Re: [Error] ¿Porqué no compila este simple programa?
Publicado por: edr89 en 22 Junio 2013, 23:54 PM
Cita de: aguml en 16 Junio 2013, 16:49 PM
Otra cosa ¿incluir iostream solo para una pausa? con lo bien que funciona getc o getchar y ya estan en stdio.h jejeje.

getch() hace pausas y no muestra caracteres, tampoco necesita parametros, me gusta.

Cita de: Zodiak98 en 16 Junio 2013, 16:21 PM
Hola amigos, bueno este tema lo hago porqué me puse a practicar con los archivos de cabecera, pero tengo un error al compilar me sale estos 2 errores
tengo un archivo de cabecera para un codigo y trate de incluir toda la informacion del preprocesador ahi, en este caso los prototipos de tus funciones basta que esten en el archivo.h y lo incluyas en tu codigo o las declares directamente antes de main().
Título: Re: [Error] ¿Porqué no compila este simple programa?
Publicado por: amchacon en 23 Junio 2013, 00:28 AM
Cita de: 0xDani en 16 Junio 2013, 16:30 PM
El caso es que el compilador no te incluye automáticamente los archivos de implementación. Puedes probar a dejar el archivo de cabecera así:

Código (cpp) [Seleccionar]
//operaciones.h

#ifndef OPERACIONES_H_INCLUDED
#define OPERACIONES_H_INCLUDED

#include <iostream>
#include <stdio.h>

int suma(int x , int y);
int resta(int x , int y);

#include "operaciones.cpp" <--- Fijate en esto

#endif


Y quitar el include en operaciones.cpp.

Otra opción sería crear una biblioteca estática o dinámica.

Saludos.
Joe Dani, no recomiendes esas chapuzas xDDDD

Lo de la biblioteca estática es mejor. Para ello tienes que añadir el archivo .cpp en tu IDE.