Ошибка LNK2005: уже определено при включении заголовочного файла дважды

Мне нужно отредактировать и получить доступ к нескольким переменным в нескольких файлах cpp в проекте Visual Studio. Поэтому я создал заголовочный файл с пространством имен, содержащим все переменные, которые мне нужны, следующим образом:

namespace windowdimension{
    TCHAR openwindows[20][180];
    int winnum = 0;
    int windowleft = 0;
    int windowright = 1360;
    INT windowtop = 0;
    INT windowbottom = 768;
    LONG leftarray[20];
    LONG rightarray[20];
    LONG toparray[20];
    LONG bottomarray[20];

}

Однако если я #include этот заголовочный файл в двух исходных файлах, я получаю эту ошибку компоновщика 2005, говоря, что параметр уже был определен в другом объекте.

Обращаясь к другому вопросу той же ошибки, я узнал здесь, что

определение функции может появиться только один раз. Каждый файл.cpp, который включает в себя ваш файл.h, будет генерировать еще одну копию функции.

Но верно ли это для переменных пространства имен? Если да, как мы можем обеспечить доступ к определенной переменной в нескольких исходных файлах?

2 ответа

Решение

Вы никогда не должны определять глобальные переменные в заголовочном файле.

Чтобы иметь возможность поделиться, вам нужно объявить их в заголовочном файле (используя extern ключевое слово) и определите только один раз в файле.cpp.

Конечно, никогда не забывайте о включении охранников в каждый заголовочный файл (#pragma once это довольно портативное решение):

global.hpp

#pragma once

namespace global {
   extern int variable;
}

global.cpp

namespace global {
   int variable = 0;
}

В любом случае, использование глобальных переменных - очень плохая практика.

Вы, вероятно, забыли добавить защиту включения:

header.h

#ifndef HEADER_H
#define HEADER_H

namespace something {
}

#endif

Другой вариант заключается в использовании #pragma once в самом начале вашего заголовочного файла.

Другие вопросы по тегам