Jeggu
Jeggu

Reputation: 579

Error already defined

Hi i just created a sample class and using it in main but i am getting already defined error.

sample.h

#ifndef __sample__
#define __sample__
#include<iostream>
using namespace std;

int count = 10;

class sample
{
public:
    sample();
    int Get();
private:
    int i;
};
#endif

sample.cpp

#include "sample.h"
sample::sample()
{
    cout<<"hello two";
}
int sample::sample()
{
    return 10;
}

main.cpp

#include <iostream>
#include "sample.h"
using namespace std;

int main(void)
{
    int test = count;
    return 0;
}

Link error: main.obj : error LNK2005: "int count" (?count@@3HA) already defined in sample.obj

if u see above class i am using #ifndef and #define, actually there things will declare data once thought we include in many places.could some one explain me clearly why its giving that link error.

Upvotes: 2

Views: 1198

Answers (4)

molbdnilo
molbdnilo

Reputation: 66441

Remember that #include literally means "add the contents of this file here".
Include guards only protects against a file's content being included more than once per file it's included in.

When the preprocessor has done its preprocessing, this is what your compiler sees:

sample.cpp

[iostream contents here...]

using namespace std;

int count = 10;

class sample
{
public:
    sample();
    int Get();
private:
    int i;
};

sample::sample()
{
    cout<<"hello two";
}
int sample::sample()
{
    return 10;
}

main.cpp

[iostream contents here...]

using namespace std;

int count = 10;

class sample
{
public:
    sample();
    int Get();
private:
    int i;
};

using namespace std;

int main(void)
{
    int test = count;
    return 0;
}

As you can see, there are two definitions of count, one in each file (formally, "translation unit").

The solution is to have a declaration of the variable in "sample.h"

extern int count;

and have the one and only definition in sample.cpp:

int count = 10;

(And you should not put using namespace std; in a header.)

Upvotes: 3

Vlad from Moscow
Vlad from Moscow

Reputation: 311048

You have either to declare variable count as having internal linkage as for example

#ifndef __sample__
#define __sample__
#include<iostream>
using namespace std;

namespace
{
    int count = 10;
}
//...

#endif

(the above internal declaration valid in C++ 2011) or

#ifndef __sample__
#define __sample__
#include<iostream>
using namespace std;

static int count = 10;

//...

#endif

Or to declare it as having external linkage but define it only once in some module. Fpr example

#ifndef __sample__
#define __sample__
#include<iostream>
using namespace std;

extern int count;

//...

#endif

#include "sample.h"

int count = 10;
sample::sample()
{
    cout<<"hello two";
}
int sample::sample()
{
    return 10;
}

Otherwise the compiler will issue an error that variable count is defined more than once that is that more than one compilation unit (in this case sample.cpp and main.cpp) contain the variable definition.

Upvotes: 0

Marco A.
Marco A.

Reputation: 43662

Include guards only guard against including the same header file multiple times, not against multiple definitions. You should move your variable in a cpp file in order to not violate the ODR, or use internal linkage or declare it external and define it somewhere once. There are multiple solutions depending on the use of that variable.

Notice that I'm ignoring the fact that you probably meant int sample::Get() in the sample.cpp file

#include "sample.h"
sample::sample()
{
    cout<<"hello two";
}
int sample::sample() // ??
{
    return 10;
}

Upvotes: 0

Andy Newman
Andy Newman

Reputation: 1208

To make a global variable like that visible everywhere:

blah.h

extern int count;

blah.cpp

int count(10);

Upvotes: 0

Related Questions