Подтвердить что ты не робот

Множественное определение ошибки... 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, который я использую в своем проекте. Любая помощь в решении этой проблемы?

4b9b3361

Ответ 1

Не задавайте переменные в заголовках. Поместите объявления в заголовки и определения в один из файлов .c.

В config.h

extern const char *names[];

В некотором .c файле:

const char *names[] =
    {
        "brian", "stefan", "steve"
    };

Если вы поместите определение глобальной переменной в файл заголовка, это определение будет передаваться в каждый .c файл, который включает этот заголовок, и вы получите множественную ошибку определения, потому что varible может быть объявлен несколько раз, но может быть определен только один раз.

Ответ 2

Объявления публичных функций идут в файлах заголовков, да, но определения абсолютно верны и в заголовках! Вы можете объявить определение статическим (только 1 копия, разрешенная для всей программы), если вы определяете вещи в заголовке для служебных функций, которые вы не хотите определять снова в каждом файле c. И.Е. определяя перечисление и статическую функцию для перевода перечисления в строку. Тогда вам не придется переписывать перечисление на строковый переводчик для каждого .c файла, который включает заголовок.:)