Поиск:

Ответ в темуСоздание новой темы Создание опроса
> error C2374: [переменная] : redefinition; multiple initialization 
:(
    Опции темы
malor
  Дата 27.6.2011, 14:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 632
Регистрация: 17.11.2006

Репутация: нет
Всего: нет



Раскидал содержимое 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'а?
PM MAIL   Вверх
triclosan
Дата 27.6.2011, 15:07 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 515
Регистрация: 18.8.2006

Репутация: 1
Всего: 12



в файлах-хедерах есть проверки на "многоразовое" включение?

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



Это сообщение отредактировал(а) triclosan - 27.6.2011, 15:47
PM MAIL   Вверх
malor
  Дата 27.6.2011, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 632
Регистрация: 17.11.2006

Репутация: нет
Всего: нет



Добавил #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
PM MAIL   Вверх
maxim1000
Дата 27.6.2011, 17:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 1
Всего: 110



определения (не объявления) статических переменных в h-файлах?


Это сообщение отредактировал(а) maxim1000 - 27.6.2011, 17:52


--------------------
qqq
PM WWW   Вверх
malor
  Дата 27.6.2011, 19:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 632
Регистрация: 17.11.2006

Репутация: нет
Всего: нет



В Path.h строки вида:
const char* pathEventKB = "Z:\\EventKB.txt";
PM MAIL   Вверх
maxim1000
Дата 27.6.2011, 19:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 1
Всего: 110



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

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



--------------------
qqq
PM WWW   Вверх
malor
  Дата 27.6.2011, 19:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 632
Регистрация: 17.11.2006

Репутация: нет
Всего: нет



Я сейчас заменил строку (а также и прочие)
const char* pathEventKB = "Z:\\EventKB.txt"; 
на 
#define pathEventKB            "Z:\\EventKB.txt"
и скомпилилось без error'ов. Так не считается правильным ?
PM MAIL   Вверх
maxim1000
Дата 27.6.2011, 21:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 1
Всего: 110



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


--------------------
qqq
PM WWW   Вверх
malor
  Дата 27.6.2011, 21:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 632
Регистрация: 17.11.2006

Репутация: нет
Всего: нет



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


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 1
Всего: 110



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

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

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


--------------------
qqq
PM WWW   Вверх
Сыроежка
Дата 28.6.2011, 20:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 127
Регистрация: 24.6.2011

Репутация: нет
Всего: 1



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


Это правильно, но не эффективно. Если у вашего компилятора не включена опция дублирующиеся строковые литералы хранить как один литерал, то каждый раз, когда вы будете использовать эту манифестную константу, объем вашего кода будет увеличиваться.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.1220 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.