Помогите пожалуйста разобраться.Пишу в 2005ой студии.
К примеру — есть 2 .cpp файла(main.cpp и second.cpp),использующие один и тот же заголовок(пусть это будет header.h).В заголовке объявлена переменная LPDIRECT3D9 g_lpD3D;
При компиляции выдает ошибку линкера
1>second.obj : error LNK2005: "struct IDirect3D9 * g_lpD3D" (...) already defined in main.obj
содержание заголовка:
#pragma once
#ifndef _HEADER_H
#define _HEADER_H
LPDIRECT3D9 g_lpD3D;
#endif
я решил проблему добавив /FORCE в коммандную строку линкера,и он ошибку просто игнорирует(показывает ее как WARNING)...
Не подскажете другой способ исправления данной проблемы(без /FORCE)?
Здравствуйте, Sashaka, Вы писали:
__C_>>Не подскажете другой способ исправления данной проблемы(без /FORCE)?
S>описание структуры в H-ник, объявлениe в cpp, в других cpp использовать: S>#include "mystruct.h" S>extern mystruct g_mystruct;
S>а ваще глобальные переменные — нехорошо!
Здравствуйте, Sashaka, Вы писали:
S>>>а ваще глобальные переменные — нехорошо!
_C_>>Что же такого нехорошего в глобальных переменных?
S>для меня например то, что у них нет владельца и то что они засирают namespace.
Дай определение термину "владелец" для данного случая.
А namespace тут при чем?
S>а вообще по этому поводу достаточно написано.
S>а ты на с++ пишешь?
S>для меня например то, что у них нет владельца и то что они засирают namespace.
S>а вообще по этому поводу достаточно написано.
Да на С++...просто некоторые переменные решил сделать глобальными — мне кажется что так удобнее...странно,но по-моему в предыдущих версиях
VC++ можно было объявлять и определять переменные в header'ах...а может я не прав и что-то путаю
Здравствуйте, _Cli_jmp, Вы писали:
_C_>Здравствуйте, Sashaka, Вы писали:
S>>а ты на с++ пишешь?
S>>для меня например то, что у них нет владельца и то что они засирают namespace.
S>>а вообще по этому поводу достаточно написано.
_C_>Да на С++...просто некоторые переменные решил сделать глобальными — мне кажется что так удобнее...странно,но по-моему в предыдущих версиях _C_>VC++ можно было объявлять и определять переменные в header'ах...а может я не прав и что-то путаю
Если этот хидер включается только в один cpp, то можно
Или можно пометить определение с помощью __declspec(selectany). Это будет примерно то же самое, как когда статическая переменная шаблонного класса определяется в h файле, но проблем не возникает — линкер просто выбирает первую попавшуюся копию, а остальные отбрасывает.
Здравствуйте, remark, Вы писали:
R>Если этот хидер включается только в один cpp, то можно
да вот в том то и дело что не в один...
R>Или можно пометить определение с помощью __declspec(selectany). Это будет примерно то же самое, как когда статическая переменная шаблонного класса определяется в h файле, но проблем не возникает — линкер просто выбирает первую попавшуюся копию, а остальные отбрасывает.
Здравствуйте, c-smile, Вы писали:
CS>Здравствуйте, Sashaka, Вы писали:
S>>>>а ваще глобальные переменные — нехорошо!
_C_>>>Что же такого нехорошего в глобальных переменных?
S>>для меня например то, что у них нет владельца и то что они засирают namespace.
CS>Дай определение термину "владелец" для данного случая.
В данном случае я не уверен, что человек пишет на С++, а не на С.
А так, я имею ввиду инкапсуляцию.
CS>А namespace тут при чем?
Ну, например, IDE студии показывает все глобальные переменные и функции в одном списке. Мне попадался проект где их там было около 100 штук, с именами типа "PrTGWW", часть из них использовалась в логике работы программы, из различных потоков, без всякой синхронизации. Такие переменные сложно отслеживать, где они инициализируются, кто к ним обращается, из каких потоков...
Самое интересное, что прога довольно нормально работала, пока не появились компы с p4 двуядерными или с hyperthreading...
S>>а вообще по этому поводу достаточно написано.
CS>На заборах или где? Давай пальцем показывай.
Здравствуйте, Sashaka, Вы писали:
S>>>>>а ваще глобальные переменные — нехорошо! _C_>>>>Что же такого нехорошего в глобальных переменных? S>>>для меня например то, что у них нет владельца и то что они засирают namespace. CS>>Дай определение термину "владелец" для данного случая. S>А так, я имею ввиду инкапсуляцию.
Я не понимаю как связаны "инкапсуляция" и "глобалная переменная".
Если тебе нужна глобальная переменная по смыслу то хоть обинкапсулируй все вокруг но избежать глобальной переменной тебе не удастся.
CS>>А namespace тут при чем?
S>Ну, например, IDE студии показывает все глобальные переменные и функции в одном списке. Мне попадался проект где их там было около 100 штук, с именами типа "PrTGWW", часть из них использовалась в логике работы программы, из различных потоков, без всякой синхронизации. Такие переменные сложно отслеживать, где они инициализируются, кто к ним обращается, из каких потоков...
S>Самое интересное, что прога довольно нормально работала, пока не появились компы с p4 двуядерными или с hyperthreading...
"Плохо работает на двухядерном потому что в IDE я вижу 100 штук PrTGWW".
Это не программирование. Это какая-то лирика и гадание на кофейной гуще.
S>>>а вообще по этому поводу достаточно написано. CS>>На заборах или где? Давай пальцем показывай. S>например, в этой книжке
И чего там так и написано: "а ваще глобальные переменные — нехорошо!"? Если да, то выкинь ту книжку.
Как и с любым другим разделямым ресурсом, работа с этими переменными имеет особенности — это да.
Здравствуйте, c-smile, Вы писали:
CS>И чего там так и написано: "а ваще глобальные переменные — нехорошо!"? Если да, то выкинь ту книжку. CS>Как и с любым другим разделямым ресурсом, работа с этими переменными имеет особенности — это да.
так их что — в каждом .cpp файле объявлять ключевым словом extern или как?
я просто других способов кроме этого и объявления /FORCE(не знаю чревато это чем-то или нет) не знаю
Здравствуйте, _Cli_jmp, Вы писали:
_C_>Здравствуйте, c-smile, Вы писали:
CS>>И чего там так и написано: "а ваще глобальные переменные — нехорошо!"? Если да, то выкинь ту книжку. CS>>Как и с любым другим разделямым ресурсом, работа с этими переменными имеет особенности — это да.
_C_>так их что — в каждом .cpp файле объявлять ключевым словом extern или как?
Да, нет. Просто в этом h-нике, где у тебя сейчас определение, объяви extern.
_C_>я просто других способов кроме этого и объявления /FORCE(не знаю чревато это чем-то или нет) не знаю
/FORCE и __declspec(selectany) работать-то должны, но попахивает это дурно. Лучше extern.
CS>И чего там так и написано: "а ваще глобальные переменные — нехорошо!"? Если да, то выкинь ту книжку. CS>Как и с любым другим разделямым ресурсом, работа с этими переменными имеет особенности — это да.
Здравствуйте, remark, Вы писали:
R>/FORCE и __declspec(selectany) работать-то должны, но попахивает это дурно. Лучше extern.
R>
Итак,с __delspec(selectany) не работает.сделал отдельный .cpp файл,где определил переменные...в хедере объявил их со словом extern,все равно та же самая ошибка линкера....работает только с /FORCE...странно...
Здравствуйте, _Cli_jmp, Вы писали:
_C_>Здравствуйте, remark, Вы писали:
R>>/FORCE и __declspec(selectany) работать-то должны, но попахивает это дурно. Лучше extern.
R>>
_C_>Итак,с __delspec(selectany) не работает.сделал отдельный .cpp файл,где определил переменные...в хедере объявил их со словом extern,все равно та же самая ошибка линкера....работает только с /FORCE...странно...
Ты что-то напутал. Должно работать и с __delspec(selectany), и с extern.
Rebuild попробуй...