Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > error C2374: [переменная] : redefinition;


Автор: malor 27.6.2011, 14:44
Раскидал содержимое MakeScreenShot.cpp по разным cpp и добавил хедеров, теперь VS2008 пишет: 
Цитата
Compiling...
MakeScreenShot.cpp
c:\_remote\makescreenshot\makescreenshot\path.h(4) : error C2374: 'pathEventKB' : redefinition; multiple initialization
        c:\_remote\makescreenshot\makescreenshot\path.h(4) : see declaration of 'pathEventKB'
c:\_remote\makescreenshot\makescreenshot\path.h(5) : error C2374: 'pathEventMouse' : redefinition; multiple initialization
        c:\_remote\makescreenshot\makescreenshot\path.h(5) : see declaration of 'pathEventMouse'
c:\_remote\makescreenshot\makescreenshot\path.h(6) : error C2374: 'pathLog' : redefinition; multiple initialization
        c:\_remote\makescreenshot\makescreenshot\path.h(6) : see declaration of 'pathLog'
c:\_remote\makescreenshot\makescreenshot\path.h(7) : error C2374: 'pathImageDesktop' : redefinition; multiple initialization
        c:\_remote\makescreenshot\makescreenshot\path.h(7) : see declaration of 'pathImageDesktop'

Сами переменные pathEventKB и т.д. лежат в файле Path.h. 

Внутри файла MakeScreenShot.cpp  есть строки:
#include "keyboard.h"
#include "mouse.h"


Внутри каждого из этих двух заголовочных файлов есть строка:
#include "Log.h"

A файле "Log.h" есть строка:
#include "Path.h". 

Как сделать, чтоб не было redefinition'а?

Автор: triclosan 27.6.2011, 15:07
в файлах-хедерах есть проверки на "многоразовое" включение?

Если нет - необходимо добавить стандартную-переносимую, либо, раз у вас VS2008 можно #pragma once


Автор: malor 27.6.2011, 16:55
Добавил #pragma once в файл Path.h, теперь такие error'ы про LNK2005:
Цитата
Error    23    error LNK2005: "char const * const pathEventKB" (?pathEventKB@@3PBDB) already defined in MakeScreenShot.obj    keyboard.obj
Error    24    error LNK2005: "char const * const pathEventMouse" (?pathEventMouse@@3PBDB) already defined in MakeScreenShot.obj    keyboard.obj
Error    25    error LNK2005: "char const * const pathLog" (?pathLog@@3PBDB) already defined in MakeScreenShot.obj    keyboard.obj
........... etc .....................................

user posted image

Автор: maxim1000 27.6.2011, 17:52
определения (не объявления) статических переменных в h-файлах?

Автор: malor 27.6.2011, 19:06
В Path.h строки вида:
const char* pathEventKB = "Z:\\EventKB.txt";

Автор: maxim1000 27.6.2011, 19:12
надо в h-файлах оставить _объявления_, а в cpp перенести _определения_

объявление: extern const char *pathEventKB;
определение: const char *pathEventKB="something";

Автор: malor 27.6.2011, 19:24
Я сейчас заменил строку (а также и прочие)
const char* pathEventKB = "Z:\\EventKB.txt"; 
на 
#define pathEventKB            "Z:\\EventKB.txt"
и скомпилилось без error'ов. Так не считается правильным ?

Автор: maxim1000 27.6.2011, 21:14
define'ы без надобности использовать не стоит
препроцессор C++ - по сути, другой язык и с самим C++ имеет мало общего (а иногда и конфликтует)
иногда без него не обойтись, но это не тот случай

Автор: malor 27.6.2011, 21:37
Цитата(maxim1000 @  27.6.2011,  19:12 Найти цитируемый пост)
объявление: extern const char *pathEventKB;
определение: const char *pathEventKB="something";
Я переменные хотел  поместить в один файл, чтоб если уж человек захочет сменить пути, то не придется ползать по файлам где лежат т.н. "определения". Такое удобство не обеспечить ?

Автор: maxim1000 27.6.2011, 23:35
ну если это что-то типа конфигурации для сборки программы, то, возможно, define здесь в тему - его обычно для чего-то подобного и используют

альтернативный вариант - создание класса с методами для доставания разнообразных параметров, но это есть смысл городить, только если их в процессе работы будут менять, или хотя бы для того, чтобы не пересобирать программу каждый раз при изменении настроек

если же это что-то вроде прототипа для локального использования, то, наверное, define - OK

Автор: Сыроежка 28.6.2011, 20:41
Цитата(malor @  27.6.2011,  19:24 Найти цитируемый пост)
Я сейчас заменил строку (а также и прочие)
const char* pathEventKB = "Z:\\EventKB.txt"; 
на 
#define pathEventKB            "Z:\\EventKB.txt"
и скомпилилось без error'ов. Так не считается правильным ? 


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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)