Множественное определение переменной пространства имен, компиляция С++

Я пишу простой Makefile, который выглядит как

CC=gcc
CXX=g++
DEBUG=-g
COMPILER=${CXX}
a.out: main.cpp Mail.o trie.o Spambin.o
        ${COMPILER}  ${DEBUG} main.cpp Mail.o trie.o Re2/obj/so/libre2.so

trie.o: trie.cpp
        ${COMPILER}  ${DEBUG} -c trie.cpp

Mail.o: Mail.cpp
        ${COMPILER} ${DEBUG} -c Mail.cpp

Spambin.o: Spambin.cpp
        ${COMPILER} ${DEBUG} -c Spambin.cpp

clean: 
        rm -f *.o

У меня есть имя файла config.h, которое требуется в Mail.cpp и Spambin.cpp, поэтому у меня есть #include "config.h" в Mail.cpp и Spambin.cpp. config.h выглядит следующим образом:

#ifndef __DEFINE_H__
#define __DEFINE_H__

#include<iostream>

namespace config{
        int On = 1;
        int Off = 0;

        double S = 1.0;
}
#endif

But when I try to compile the code it gives me
Mail.o:(.data+0x8): multiple definition of `config::On'
/tmp/ccgaS6Bh.o:(.data+0x8): first defined here
Mail.o:(.data+0x10): multiple definition of `config::Off'
/tmp/ccgaS6Bh.o:(.data+0x10): first defined here

Может ли кто-нибудь помочь мне отладить это?

Ответ 1

Вы не можете назначать переменные пространства имен в файлах заголовков. Выполнение этого определяет переменные, а не просто их объявление. Поместите это в отдельный исходный файл и добавьте его в Makefile, и он должен работать.

Изменить. Кроме того, вы должны сделать объявления в файле заголовка extern.

Итак, в файле заголовка пространство имен должно выглядеть так:

namespace config{
    extern int On;
    extern int Off;

    extern double S;
}

И в исходном файле:

namespace config{
    int On = 1;
    int Off = 0;

    double S = 1.0;
}

Ответ 2

Посмотрите переменное определение в файлах заголовков

Вы должны указать определение переменной, то есть присвоить значение в исходном файле или защитить его с помощью защитника #ifdef, который не будет дважды задан, если он включен в отдельные исходные файлы.

Ответ 3

В вашем файле заголовка объявите const ваши 3 переменные. Например, например:

#ifndef __DEFINE_H__
#define __DEFINE_H__

#include<iostream>

namespace config{
        const int On = 1;
        const int Off = 0;

        const double S = 1.0;
}
#endif