14 / 14 / 6
Регистрация: 11.07.2015
Сообщений: 147
|
|
1 | |
Несколько *.cpp и глобальные переменные08.03.2016, 17:44. Показов 7657. Ответов 66
Метки нет (Все метки)
Всем привет!
Есть несколько *.cpp файлов, к которым подключен один *.h файл. В *.h файле объявлены глобальные переменные, работа с которыми осуществляется из всех *.cpp файлов. При компиляции выдало ошибку, кто переменная уже есть в *.obj файле. Стало компилироваться, когда я все переменные сделал static, но при этом оно воспринимает одну и ту же переменную в каждом файле как отдельную переменную. Как решить эту проблему?
0
|
08.03.2016, 17:44 | |
Ответы с готовыми решениями:
66
Глобальные переменные в других cpp файлах Глобальные и статические глобальные переменные глобальные переменные Глобальные переменные |
148 / 118 / 37
Регистрация: 27.10.2011
Сообщений: 690
|
|||||||||||
08.03.2016, 17:48 | 2 | ||||||||||
В хедере убери все спецификаторы у глобальной переменной. А в cpp припиши к каждой экспортируемой переменной "extern":
1
|
88 / 88 / 80
Регистрация: 25.08.2013
Сообщений: 337
|
|
08.03.2016, 17:48 | 3 |
Определить переменную в одном файле, в других объявить эту переменную предварив спецификатором extern.
1
|
BrainOverflow
126 / 130 / 64
Регистрация: 31.03.2013
Сообщений: 556
|
||||||
08.03.2016, 17:50 | 4 | |||||
yrceus, наоборот, в хедере ее объявить с extern, а в .cpp уже инициализировать ее без extern:
3
|
88 / 88 / 80
Регистрация: 25.08.2013
Сообщений: 337
|
|
08.03.2016, 18:17 | 5 |
Ага, а в одном из cpp определить и инициализировать. Если в хедере определить, то можно вообще без extern объявлений)
Но в общем смысле, в одном из файлов определить, в остальных объявить с extern.
1
|
14 / 14 / 6
Регистрация: 11.07.2015
Сообщений: 147
|
||||||
08.03.2016, 18:27 [ТС] | 6 | |||||
Спасибо за ответы! А
0
|
BrainOverflow
126 / 130 / 64
Регистрация: 31.03.2013
Сообщений: 556
|
|
08.03.2016, 18:37 | 7 |
anem, чтобы избежать повторного включения одного и того же кода.
1
|
14 / 14 / 6
Регистрация: 11.07.2015
Сообщений: 147
|
|||||||||||
08.03.2016, 18:47 [ТС] | 8 | ||||||||||
Спасибо! Еще такой вопрос: как быть с
Добавлено через 6 минут С std::ofstream не сработало.
0
|
BrainOverflow
126 / 130 / 64
Регистрация: 31.03.2013
Сообщений: 556
|
|||||||||||
08.03.2016, 18:57 | 10 | ||||||||||
anem, попробуйте в хедере
1
|
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
|
|||||||||||
08.03.2016, 19:45 | 11 | ||||||||||
Сообщение было отмечено anem как решение
Решение
Тут, я так понимаю, уже инициализация, значит extern будет проигнорирован.
Попробуй в хедере:
1
|
Вездепух
11696 / 6375 / 1724
Регистрация: 18.10.2014
Сообщений: 16,071
|
|||||||||||
08.03.2016, 22:26 | 12 | ||||||||||
Сообщение было отмечено anem как решение
Решение
Extern дает сущности (переменной или функции) внешнее связывание. "Проингорован" он не будет, а просто сделает то, что уже сделано, т.е. даст внешнее связывание переменной у которой и так внешнее связывание.
А в остальном верно. В заголовке
1
|
08.03.2016, 22:46 | 14 | |||||||||||||||
Sabnik18, насколько я понял,в хедере
0
|
Вездепух
11696 / 6375 / 1724
Регистрация: 18.10.2014
Сообщений: 16,071
|
|
08.03.2016, 22:57 | 15 |
"Переменную нельзя инициализировать в объявлении с extern"???
Я, наверное, не совсем понимаю, а каком контексте это было сказано, ибо без контекста - это совершенно неверное утверждение. Есть какое-то странное поверье, что 'extern' предназначено именно для превращения определений в объявления. В результате если 'extern' вдруг используется в определении переменной (т.е. в присутствии инициализатора), то начинаются какие-то странные возмущения на тему того, что так, мол, делать "нельзя" и это, мол, "неправильно". Ничего неправильного тут на самом деле нет. Фундаментальное назначение 'extern' - давать сущностям внешнее связывание. Для этой цели применяться 'extern' может в одинаковой мере и в объявлениях сущностей, и в определениях сущностей. Надо просто уметь отличать одни от других. То, что 'extern' может использоваться для превращения определения переменной в объявление переменной - не более чем побочное, второстепенное использование 'extern'. Другое дело, что использование 'extern' в его фундаментальная роли практически всегда опционально (избыточно), ибо почти все сущности в С++ и так по умолчанию обладают внешним связыванием. Поэтому на первый план выходит второстепенные роли 'extern'. Однако при работе с глобальными 'const' объектами фундаментальная роль 'extern' в ряде случаев может выходить на первый план, ибо в С++ 'const' объекты по умолчанию имеют внутренее связывание. Добавлено через 54 секунды Нет, вы поняли все задом наперед. Все должно быть наоборот, как показано в сообщении #11 от nd2 (Несколько *.cpp и глобальные переменные)
3
|
08.03.2016, 23:02 | 16 | |||||
я понимаю, что наоборот, это был ответ для сабника)
Также еще стоит сказать, что хедер еще неплохо обернуть т.е.:
1
|
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
|
||||||
08.03.2016, 23:09 | 17 | |||||
Вот и я не понимаю.
Делаю в хедере, который подключается к нескольким .cpp (в студии, 10-й):
0
|
08.03.2016, 23:10 | 18 | ||||||||||
TheCalligrapher, в контексте определения
Но такое определение по-моему полностью равносильно
1
|
Ferrari F1
|
08.03.2016, 23:18
Несколько *.cpp и глобальные переменные
#20
|
Не по теме: nd2, по поводу Лафоре: его книга была моей первой книгой.
0
|
08.03.2016, 23:18 | |
Глобальные переменные Глобальные переменные Глобальные переменные Глобальные переменные Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |