Множественное определение переменной пространства имен, компиляция С++
Я пишу простой 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