Множественное определение ошибки... linker
Я определил специальный файл: config.h
В моем проекте также есть файлы:
t.c, t.h
pp.c, pp.h
b.c b.h
l.cpp
и # включает:
в t.c:
#include "t.h"
#include "b.h"
#include "pp.h"
#include "config.h"
в b.c:
#include "b.h"
#include "pp.h"
в pp.c:
#include "pp.h"
#include "config.h"
в l.cpp:
#include "pp.h"
#include "t.h"
#include "config.h"
нет никаких директив include в моих файлах *.h
, только в файлах *.c
. Я определил это в config.h:
const char *names[i] =
{
"brian", "stefan", "steve"
};
и нужен этот массив в l.cpp, t.c, pp.c, но Im получает эту ошибку:
pp.o:(.data+0x0): multiple definition of `names'
l.o:(.data+0x0): first defined here
t.o:(.data+0x0): multiple definition of `names'
l.o:(.data+0x0): first defined here
collect2: ld returned 1 exit status
make: *** [link] Error 1
У меня есть защита в каждом файле *.h
, который я использую в своем проекте. Любая помощь в решении этой проблемы?
Ответы
Ответ 1
Не задавайте переменные в заголовках. Поместите объявления в заголовки и определения в один из файлов .c.
В config.h
extern const char *names[];
В некотором .c файле:
const char *names[] =
{
"brian", "stefan", "steve"
};
Если вы поместите определение глобальной переменной в файл заголовка, это определение будет передаваться в каждый .c файл, который включает этот заголовок, и вы получите множественную ошибку определения, потому что varible может быть объявлен несколько раз, но может быть определен только один раз.
Ответ 2
Объявления публичных функций идут в файлах заголовков, да, но определения абсолютно верны и в заголовках! Вы можете объявить определение статическим (только 1 копия, разрешенная для всей программы), если вы определяете вещи в заголовке для служебных функций, которые вы не хотите определять снова в каждом файле c. И.Е. определяя перечисление и статическую функцию для перевода перечисления в строку. Тогда вам не придется переписывать перечисление на строковый переводчик для каждого .c файла, который включает заголовок.:)