Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.88/41: Рейтинг темы: голосов - 41, средняя оценка - 4.88
14 / 14 / 6
Регистрация: 11.07.2015
Сообщений: 147
1

Несколько *.cpp и глобальные переменные

08.03.2016, 17:44. Показов 7657. Ответов 66
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет!
Есть несколько *.cpp файлов, к которым подключен один *.h файл. В *.h файле объявлены глобальные переменные, работа с которыми осуществляется из всех *.cpp файлов. При компиляции выдало ошибку, кто переменная уже есть в *.obj файле. Стало компилироваться, когда я все переменные сделал static, но при этом оно воспринимает одну и ту же переменную в каждом файле как отдельную переменную. Как решить эту проблему?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.03.2016, 17:44
Ответы с готовыми решениями:

Глобальные переменные в других cpp файлах
Есть slovar.h int n Slovar.cpp n = 5; Как использовать эту n в файле dosomething.cpp...

Глобальные и статические глобальные переменные
Скажите, чем отличаются глобальные переменные от статических глобальных переменных?

глобальные переменные
здравствуйте, я только начал изучать C++, в книге Штидта Г. есть такой код, он выводит: count +...

Глобальные переменные
Я правильно понимаю: "в c++ использовать глобальные переменные не безопасно, т. к. др. программы...

66
148 / 118 / 37
Регистрация: 27.10.2011
Сообщений: 690
08.03.2016, 17:48 2
В хедере убери все спецификаторы у глобальной переменной. А в cpp припиши к каждой экспортируемой переменной "extern":

C++
1
2
3
4
5
6
7
хедер:
#ifndef EXAMPLE_H
#define EXAMPLE_H
 
int a = 10;
 
#endif
C++
1
2
3
4
цпп-шник:
#include "имя_хедера"
 
extern int a;
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:
C++
1
2
3
4
5
6
7
8
9
10
//.h
//....
extern int x;
//....
 
 
//.cpp
//....
int x = 15;
//....
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
Спасибо за ответы! А
C++
1
2
3
4
#ifndef EXAMPLE_H
#define EXAMPLE_H
...
#endif
для чего нужно? Чтоб оно только один раз инициализировалось?
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
Спасибо! Еще такой вопрос: как быть с
C++
1
std::ofstream f("text.txt");
Я так представляю, что н хэдэре нужно объявить так, как я написал, а в *.cpp файлах так:
C++
1
extern std::ofstream f;
Но хотелось бы уточнить, чтоб избежать скрытых ошибок.

Добавлено через 6 минут
С std::ofstream не сработало.
0
805 / 532 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
08.03.2016, 18:49 9
anem,
Цитата Сообщение от anem Посмотреть сообщение
С std::ofstream не сработало.
в хедере нужно сперва подключить заголовочный файл перед объявлением объекта.
C++
1
#include <fstream>
Думаю, должно помочь.
1
BrainOverflow
126 / 130 / 64
Регистрация: 31.03.2013
Сообщений: 556
08.03.2016, 18:57 10
anem, попробуйте в хедере
C++
1
extern std::ofstream f("file.txt");
а в *.cpp
C++
1
ofstream f;
может получится. Сам не знаю, если честно. Поправьте, кто знает.
1
nd2
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
08.03.2016, 19:45 11
Лучший ответ Сообщение было отмечено anem как решение

Решение

Цитата Сообщение от Sabnik18 Посмотреть сообщение
extern std::ofstream f("file.txt");
Тут, я так понимаю, уже инициализация, значит extern будет проигнорирован.
Попробуй в хедере:
C++
1
2
#include <fstream>
extern std::ofstream f;
В .cpp:
C++
1
std::ofstream f("file.txt");
1
Вездепух
Эксперт CЭксперт С++
11696 / 6375 / 1724
Регистрация: 18.10.2014
Сообщений: 16,071
08.03.2016, 22:26 12
Лучший ответ Сообщение было отмечено anem как решение

Решение

Цитата Сообщение от nd2 Посмотреть сообщение
значит extern будет проигнорирован.
Extern дает сущности (переменной или функции) внешнее связывание. "Проингорован" он не будет, а просто сделает то, что уже сделано, т.е. даст внешнее связывание переменной у которой и так внешнее связывание.

А в остальном верно. В заголовке

C++
1
2
#include <fstream>
extern std::ofstream f;
А в одном из .cpp файлов

C++
1
extern std::ofstream f("file.txt");
При этом в последнем случае 'extern' опционален.
1
nd2
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
08.03.2016, 22:34 13
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
"Проингорован" он не будет, а просто сделает то, что уже сделано, т.е. даст внешнее связывание переменной у которой и так внешнее связывание.
Я Лафоре процитировал.
Миниатюры
Несколько *.cpp и глобальные переменные  
0
805 / 532 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
08.03.2016, 22:46 14
Sabnik18, насколько я понял,в хедере
C++
1
2
#include <fstream>
extern std::ofstream f("file.txt");
или
C++
1
2
#include <fstream>
std::ofstream f("file.txt");
А в одном из .cpp файлов
C++
1
extern std::ofstream f;
0
Вездепух
Эксперт CЭксперт С++
11696 / 6375 / 1724
Регистрация: 18.10.2014
Сообщений: 16,071
08.03.2016, 22:57 15
Цитата Сообщение от nd2 Посмотреть сообщение
Я Лафоре процитировал.
"Переменную нельзя инициализировать в объявлении с extern"???

Я, наверное, не совсем понимаю, а каком контексте это было сказано, ибо без контекста - это совершенно неверное утверждение.

Есть какое-то странное поверье, что 'extern' предназначено именно для превращения определений в объявления. В результате если 'extern' вдруг используется в определении переменной (т.е. в присутствии инициализатора), то начинаются какие-то странные возмущения на тему того, что так, мол, делать "нельзя" и это, мол, "неправильно". Ничего неправильного тут на самом деле нет.

Фундаментальное назначение 'extern' - давать сущностям внешнее связывание. Для этой цели применяться 'extern' может в одинаковой мере и в объявлениях сущностей, и в определениях сущностей. Надо просто уметь отличать одни от других. То, что 'extern' может использоваться для превращения определения переменной в объявление переменной - не более чем побочное, второстепенное использование 'extern'.

Другое дело, что использование 'extern' в его фундаментальная роли практически всегда опционально (избыточно), ибо почти все сущности в С++ и так по умолчанию обладают внешним связыванием. Поэтому на первый план выходит второстепенные роли 'extern'.

Однако при работе с глобальными 'const' объектами фундаментальная роль 'extern' в ряде случаев может выходить на первый план, ибо в С++ 'const' объекты по умолчанию имеют внутренее связывание.

Добавлено через 54 секунды
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
Sabnik18, насколько я понял,в хедере
Нет, вы поняли все задом наперед. Все должно быть наоборот, как показано в сообщении #11 от nd2 (Несколько *.cpp и глобальные переменные)
3
805 / 532 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
08.03.2016, 23:02 16
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Нет, вы поняли все задом наперед.
я понимаю, что наоборот, это был ответ для сабника)
Также еще стоит сказать, что хедер еще неплохо обернуть т.е.:
C++
1
2
3
4
5
6
7
#ifndef EXAMPLE_H
#define EXAMPLE_H
 
#include <fstream>
std::ofstream f("file.txt");
 
#endif
дабы повторного определения не было.
1
nd2
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
08.03.2016, 23:09 17
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Я, наверное, не совсем понимаю, а каком контексте это было сказано, ибо без контекста - это совершенно неверное утверждение.
Вот и я не понимаю.
Делаю в хедере, который подключается к нескольким .cpp (в студии, 10-й):
C++
1
2
3
4
#include <fstream>
//extern std::ofstream f_ff("file.txt");
//std::ofstream f_ff("file.txt");
extern std::ofstream f_ff;
То, что закомментировано, даёт множественные определения. Не понимаю, чем первый extern отличается от второго?
0
805 / 532 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
08.03.2016, 23:10 18
TheCalligrapher, в контексте определения
C++
1
extern std::ofstream f("file.txt");
слово 'extern' служит лишь маркером для читающего листинг, что f будет глобальным объектом.
Но такое определение по-моему полностью равносильно
C++
1
std::ofstream f("file.txt");
т.е. без экстерна
1
nd2
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
08.03.2016, 23:14 19
Насчёт контекста.
Миниатюры
Несколько *.cpp и глобальные переменные   Несколько *.cpp и глобальные переменные  
1
Ferrari F1
08.03.2016, 23:18     Несколько *.cpp и глобальные переменные
  #20

Не по теме:

nd2, по поводу Лафоре: его книга была моей первой книгой.
Впоследствие я узнал, что он графоман, когда тот ввел меня в заблуждение утверждением о наследовании конструкторов дочерними классами. С тех пор стараюсь на него не ссылаться...

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.03.2016, 23:18

Глобальные переменные
Видел в некоторых проектах создают глобальные переменные 1 вариант: int test; 2 вариант:...

Глобальные переменные
Я хочу использовать глобальную переменную, определённую в main, в своих классах. Листинг)) ...

Глобальные переменные
Подскажите пожалуйста, почему данные в глобальной переменной перезаписываются, а не плюсуются? ...

Глобальные переменные
Как в C++ завести глобальную (общую для функции и самой программы) переменную?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru