Ошибка 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
в самом начале вашего заголовочного файла.