how to fix multiple definition error in c++?

守給你的承諾、 提交于 2021-02-05 05:22:30

问题


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

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!