1
votes

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.

4
I believe you meant int sample::Get()Piotr Skotnicki
__sample__ is a reserved identifier.T.C.
There are multiple issue to be addressed, not only the definition problem. @T.C. that edit message made me laughMarco A.
possible duplicate of error LNK2005, already defined?DevSolar

4 Answers

2
votes

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.)

0
votes

To make a global variable like that visible everywhere:

blah.h

extern int count;

blah.cpp

int count(10);
0
votes

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;
}
0
votes

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.