LNK2005: "уже определенная ошибка

Я пытаюсь использовать глобальную переменную из отдельных файлов .cpp. У меня есть файл init.h как:

//init.h
#ifndef init
#define init
int a = 3;
#endif

У меня есть файл init.cpp как: //init.cpp #include init.h

Тогда, наконец, мой файл main.cpp:

//main.cpp
#include "init.h"
int main(void)
{
    while(1)
    {
    }
}

После этого получаю ошибку:

1>init.obj : error LNK2005: "int a" (?a@@3HA) already defined in main.obj
1> ..deneme.exe : fatal error LNK1169: one or more multiply defined symbols found

Почему мой элемент управления #infdef не решает эту проблему? Я также пытался использовать #pragma once, но получил ту же ошибку. Что не так с моим кодом?


person volkan sezer    schedule 13.04.2012    source источник


Ответы (1)


Вам нужно пометить вашу переменную как extern и определить ее только один раз в файле реализации.

Теперь код выглядит так, что вы нарушаете правило одного определения. Защиты включения в этом случае не помогают, так как все единицы перевода, включающие этот заголовок, переопределяют переменную.

Что вам на самом деле нужно:

//init.h
#ifndef init
#define init
extern int a;
#endif

и определение:

//init.cpp
#include "init.h"
int a = 3;

Кроме того, подумайте дважды, прежде чем использовать глобальные переменные. Чего вы на самом деле пытаетесь достичь?

person Luchian Grigore    schedule 13.04.2012
comment
ну, я забыл написать файл init.cpp, который также включает файл init.h. Проблема все еще продолжается, когда я использую extern. - person volkan sezer; 13.04.2012
comment
@volkansezer, это не может быть правдой. Вы уверены, что не забыли удалить =3 из заголовка? Вы уверены, что объявили его как extern в заголовке, а не в файле реализации? - person Luchian Grigore; 13.04.2012
comment
да, вы правы, я изменил его, как вы рекомендуете, и проблема решена, большое спасибо. Для меня было очень важно добиться одной и той же глобальной переменной из разных исходных файлов, еще раз спасибо. - person volkan sezer; 14.04.2012