2

Whenever I try to run the following code, it says multiple definition of fin, client1, client2 and client3. Ive search throughout the internet but it seems I cant solve it by myself.Also, theres no problem with the code as I can easily run it if it`s in a single file.

struct_defined.h

    struct Card{
        char nume_banca[20];
        int cod_bancar;
        int pin;
        char nume_client[20];
        char prenume_client[20];
        double suma_bani;
    };

functions.h

    #include <iostream>
    #include <string.h>
    #include <fstream>
    #include "struct_defined.h"
    using namespace std;

    ifstream fin("date.in");
    Card client1, client2, client3;

    int verificare_client(Card &utilizator);
    int verificare_sold(Card utilizator);
    int extragere_numerar(Card &utilizator);
    int transfer_bani(Card &utilizator, Card &utilizator2);

functions.c

#include "functions.h"



int verificare_client(Card &utilizator)
{
    int y,x;
    marcaj_verificare:
    cout<<"\nIntroduceti codul dvs. PIN: ";
    cin>>y;
    if (utilizator.pin == y){
        cout<<"\nInregistrarea a fost efectuata cu succes.Va rugam selectati tranzactia pe care doriti s-o faceti: ";
        cout<<"\n1.Interogare sold"<<"\n"<<"2.Retragere numerar"<<"\n"<<"3.Transfer bancar"<<"\n"<<"4.Terminati sesiunea";

    }
    else{
        cout<<"\nCod PIN invalid.Va rugam reintroduceti codul dvs. PIN";
        goto marcaj_verificare;
    }

}

int verificare_sold(Card utilizator)
    {
    cout<<"\nSuma de bani disponibila in momentul de fata este "<<utilizator.suma_bani<<" lei";
}

int extragere_numerar(Card &utilizator)
    {
    int x,y;
    marcaj:
    cout<<"\nIntroduceti suma de bani pe care doriti s-o extrageti: ";
    cin>>x;
    if(x <= utilizator.suma_bani){
        cout<<"\nSuma de bani a fost extrasa cu succes.Va multumim! ";
        utilizator.suma_bani -= x;
    }
    else{
        cout<<"\nSuma de bani introdusa depaseste suma de bani disponibila.Va rugam introduceti o alta suma";
        goto marcaj;
    }

    }

int transfer_bani(Card &utilizator, Card &utilizator2)
{
int x;

if (utilizator.cod_bancar%2 == utilizator2.cod_bancar%2){
    marcaj3:
    cout<<"\nIntroduceti suma pe care doriti s-o trimiteti: ";
    cin>>x;
    if(x <= utilizator.suma_bani){
        cout<<"\nSuma de bani a fost trimisa cu succes.Va multumim! ";
        utilizator.suma_bani -= x;
        utilizator2.suma_bani += x;
    }
    else{
        cout<<"\nSuma de bani introdusa depaseste suma de bani disponibila.Va rugam introduceti o alta suma";
        goto marcaj3;
    }


}
else
    cout<<"\nPersoana careia incerceti sa trimiteti bani nu este clientul bancii noastre";

}

main.cpp

#include "functions.h"

int main()
{

fin>>client1.nume_banca>>client1.cod_bancar>>client1.pin>>client1.nume_client>>client1.prenume_client>>client1.suma_bani;
fin>>client2.nume_banca>>client2.cod_bancar>>client2.pin>>client2.nume_client>>client2.prenume_client>>client2.suma_bani;
fin>>client3.nume_banca>>client3.cod_bancar>>client3.pin>>client3.nume_client>>client3.prenume_client>>client3.suma_bani;

int answer;

verificare_client(client1);
marcaj_main:
getchar();
answer = getchar();
if(answer == '1'){
    verificare_sold(client1);
    cout<<"\nSelectati urmatoarea tranzactie pe care doriti s-o efectuati: ";
    goto marcaj_main;
}
else
    if(answer == '2'){
        extragere_numerar(client1);
        cout<<"\nSelectati urmatoarea tranzactie pe care doriti s-o efectuati: ";
        goto marcaj_main;
    }
    else
        if(answer == '3'){
            transfer_bani(client1,client2);
            cout<<"\nSelectati urmatoarea tranzactie pe care doriti s-o efectuati: ";
            goto marcaj_main;
        }
        else
            if(answer == '4'){
                cout<<"Sesiunea curenta a fost terminata.";
            }

return 0;
}
Gusti
  • 71
  • 2
  • 11
  • You've declared those in a header file and then included that header file in multiple translation units (i.e: main.cpp and functions.c). More info [here](http://stackoverflow.com/questions/11072244/c-multiple-definitions-of-a-variable) – Mohamad Elghawi Oct 12 '15 at 15:55
  • Do you header files have [include guards](https://en.wikipedia.org/wiki/Include_guard)? – NathanOliver Oct 12 '15 at 15:55
  • @MohamadElghawi Saw this already but seems like I can`t solve my code... – Gusti Oct 12 '15 at 16:18
  • Include guards don't help if you declare objects with non-static linkage in a header file, @NathanOliver. – Ulrich Eckhardt Oct 12 '15 at 17:22
  • @UlrichEckhardt I know that. The problem is the variables declared in the header file. I am just asking if they do since they are not shown. – NathanOliver Oct 12 '15 at 17:24

1 Answers1

1

"functions.h" is getting included from both "functions.c" and "main.cpp". Since you have defined (not just declared) fin, client1, client2 and client3 in the "functions.h" file, linker will complain about multiple definitions. That is because two compilation units (one corresponding to main.cpp, and the other to functions.c) will have definitions of these variables, hence the conflict.

Try moving out the definitions of these variables to a .c or .cpp file, and only retain the declarations in the .h file. That should resolve this issue.

Here's a related question and answer - Why aren't my compile guards preventing multiple definition inclusions?

Community
  • 1
  • 1