问题
I tried to look at other related posts but I'm sill stuck
My header files looks something like this
Node.hpp
#include<iostream>
using namespace std;
#ifndef NODE_HPP
#define NODE_HPP
struct Node
{
int value;
Node *start;
Node *end;
}
*start, *end;
int count= 0;
#endif
and
Queue.hpp
#include<iostream>
using namespace std;
#ifndef QUEUE_HPP
#define QUEUE_HPP
#include "Node.hpp"
class Queue{
public:
Node *nNode(int value);
void add(int value);
void remove();
void display();
void firstItem();
Queue()
{
start = NULL;
end = NULL;
}
};
#endif
My implementation for queue looks like
#include<iostream>
using namespace std;
#include "Queue.hpp"
#include<cstdio>
#include<cstdlib>
And main looks like
#include<iostream>
using namespace std;
#include "Queue.hpp"
#include<cstdio>
#include<cstdlib>
I'm getting the following errors
/tmp/ccPGEDzG.o:(.bss+0x0): multiple definition of `start'
/tmp/ccJSCU8M.o:(.bss+0x0): first defined here
/tmp/ccPGEDzG.o:(.bss+0x8): multiple definition of `end'
/tmp/ccJSCU8M.o:(.bss+0x8): first defined here
/tmp/ccPGEDzG.o:(.bss+0x10): multiple definition of `count'
/tmp/ccJSCU8M.o:(.bss+0x10): first defined here
What am I doing wrong here?
回答1:
Others already have explained the cause of the error: you are defining the same global variables in multiple translation units.
A possible fix is to define them in just one point and declare them as extern
in the header file.
However, in my opinion the real question is: do you really need those global variables? If they are meant to be part of the state of a queue object, we should make them instance variables.
class Queue{
public:
Node *nNode(int value);
void add(int value);
void remove();
void display();
void firstItem();
Queue()
{
start = NULL;
end = NULL;
}
Node *start, *end; // <----
};
In this way we can use multiple queue objects at runtime, and each of them will manage its own data. By comparison, instantiating many objects of the original class is useless, since they will all operate on the same queue.
TL;DR: encapsulate your state, avoid globals.
回答2:
Don't define global variables in header file, sperate the declaration and definition to header and implmentation file. Such as,
In header file (Node.hpp
)
extern Node *start;
extern Node *end;
extern int count;
In implmentation file (I think it's better to make a Node.cpp
here)
Node *start;
Node *end;
int count = 0;
回答3:
You define the variables start
, end
and count
in the header files. That means every source file that includes that header file will have those variables defined in its translation unit
You should only declare them in the header file if you need to have those variables global, and then define them in a single source file.
To declare a variable in a header file you mark the variables as extern
:
extern struct Node *start, *end;
extern int count;
回答4:
You are defining start
, count
and end
both in your header and main file which is causing the multiple definition error.
回答5:
***how to fix multiple definition of 'dictionaryArrayAdd' error in c*** ?
typedef struct{
int prefix; // prefix for byte > 255
int character; // the last byte of the string
} DictElement;
void dictionaryArrayAdd(int prefix, int character, int value);
int dictionaryArrayPrefix(int value);
int dictionaryArrayCharacter(int value);
DictElement dictionaryArray[4095];
// add prefix + character to the dictionary`enter code here`
void dictionaryArrayAdd(int prefix, int character, int value) {
dictionaryArray[value].prefix = prefix;
dictionaryArray[value].character = character;
}
int dictionaryArrayPrefix(int value) {
return dictionaryArray[value].prefix;
}
int dictionaryArrayCharacter(int value) {
return dictionaryArray[value].character;
}
------------------------------------------------------------------------
来源:https://stackoverflow.com/questions/35570863/how-to-fix-multiple-definition-error-in-c