Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 30, средняя оценка - 4.83
Max64
20 / 20 / 5
Регистрация: 27.10.2012
Сообщений: 156
#1

Вынести переменную в заголовочный файл - C++

22.12.2012, 19:52. Просмотров 4778. Ответов 13
Метки нет (Все метки)

Почему если вынести объявление глобальной переменной в заголовочный файл при компиляции возникает ошибка
... already defined in main.obj
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.12.2012, 19:52
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Вынести переменную в заголовочный файл (C++):

Заголовочный файл - C++
Исходный файл main.cpp #include <cstdlib> #include <iostream> #include <cstring> #include "studio.h" using namespace std; ...

Заголовочный файл - C++
Написал в заголовочном файле вот такой код: #ifndef SALES_DATA_H #define SALES_DATA_H #include <string> struct Sales_Data { ...

Заголовочный файл - C++
Здравствуйте. Помогите, пожалуйста, разобраться с заголовочными файлами и функциями-"друзьями". Например: main.cpp #include "A.h" ...

Заголовочный файл - C++
Для чево етот файл используется??? Как ево использовать в своей программе помогите хочу разобраться)

Заголовочный файл - C++
Опишите подробно, пожалуйста , как создается заголовочный файл в среде 2010 . С++

Заголовочный файл - C++
Доброго времени суток! Ситуация такая: хочу, исходя из функции, создать заголовочный файл. Но, увы, не умею создавать их. Хотелось бы...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Gus
24 / 35 / 2
Регистрация: 17.02.2009
Сообщений: 364
22.12.2012, 20:17 #2
Уже обьявлен. Use const <type> <name> = <value>; в любой из файлов программы, как локально так и глобально.
zss
Модератор
Эксперт С++
6359 / 5923 / 1920
Регистрация: 18.12.2011
Сообщений: 15,224
Завершенные тесты: 1
22.12.2012, 20:35 #3
Похоже у Вас заголовочный файл добавляется дважды.
Используйте стандартный прием
C++
1
2
3
4
#ifndef _imya_zagol_fayla
#define _imya_zagol_fayla
....// текст заголовочного файла
#endif
Max64
20 / 20 / 5
Регистрация: 27.10.2012
Сообщений: 156
22.12.2012, 20:58  [ТС] #4
Как понять добавляется дважды? Он добавляется к 2 разным .cpp файлам, в этом дело?
Kastaneda
Форумчанин
Эксперт С++
4652 / 2860 / 228
Регистрация: 12.12.2009
Сообщений: 7,268
Записей в блоге: 2
Завершенные тесты: 1
22.12.2012, 21:02 #5
Цитата Сообщение от Max64 Посмотреть сообщение
Он добавляется к 2 разным .cpp файлам, в этом дело?
да, в этом. Можешь использовать модификатор static, чтобы ограничить область видимости переменной одним файлом. Но нужно понимать, что ты делаешь, т.к. поведение может отличаться от желаемого.

zss, "стражи" тут не помогут, все равно будет редифинишн.
Max64
20 / 20 / 5
Регистрация: 27.10.2012
Сообщений: 156
22.12.2012, 21:08  [ТС] #6
Цитата Сообщение от Kastaneda Посмотреть сообщение
чтобы ограничить область видимости переменной одним файлом
Нет, тут дело вот в чем, у меня в основном .cpp файле большие участки кода которые я хотел бы вынести в функции с реализацией в отдельный .cpp файл, но как это сделать? передавать все нужные переменные в виде параметров (их очень много получится) или как я подумал объявить "общие" переменные в отдельном .h файле?
Чувствую что-то не так понимаю, объясните плиз
Kastaneda
Форумчанин
Эксперт С++
4652 / 2860 / 228
Регистрация: 12.12.2009
Сообщений: 7,268
Записей в блоге: 2
Завершенные тесты: 1
22.12.2012, 21:12 #7
Цитата Сообщение от Max64 Посмотреть сообщение
или как я подумал объявить "общие" переменные в отдельном .h файле?
тогда вынеси их в отдельный .cpp файл, а в .h файле напиши так
C++
1
2
3
extern int val1;
extern double val2;
// и т.д.
ключевое слове extern говорит о том, что это всего лишь объявление, т.е. не нужно выделять память под переменную, она выделена в другом месте. Соответственно переопределения не будет.

Но вообще похоже что-то не так с архитектурой, т.к. такая заморочка может понадобиться только в очень редких случаях.
Schizorb
509 / 461 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
22.12.2012, 21:13 #8
Max64, использовать объявления extern? А вообще может задуматься о создании класса, чтобы с глобальными переменными заморочек не было?

Добавлено через 28 секунд

Не по теме:

Опоздал

Max64
20 / 20 / 5
Регистрация: 27.10.2012
Сообщений: 156
22.12.2012, 21:24  [ТС] #9
т.е. если много параметров нужно передавать в функцию, то неправильно организован код?

Добавлено через 9 минут
Вообще я делаю программу под WinApi, соответственно там часто что-то нарисовать нужно, подсчитать и т.д., поэтому хочется научиться правильно разгружать основную функцию LRESULT CALLBACK WindowProс
Kastaneda
Форумчанин
Эксперт С++
4652 / 2860 / 228
Регистрация: 12.12.2009
Сообщений: 7,268
Записей в блоге: 2
Завершенные тесты: 1
22.12.2012, 21:24 #10
Цитата Сообщение от Max64 Посмотреть сообщение
т.е. если много параметров нужно передавать в функцию, то неправильно организован код?
Ну не всегда, я например видел код на фортране, где в функцию (или как говорят фортранщики "подпрограмму") передавалось около 10 параметров. Но там было что-то очень специфичное математическое и по другому там не сделать.
Или в WinAPI вроде тоже есть функции с огромным числом аргументов, опять же потому что по другому не сделать.

Но в общем случае стоит подумать - действительно ли это необходимо. Может можно разбить одну большую функцию на несколько маленьких.
Max64
20 / 20 / 5
Регистрация: 27.10.2012
Сообщений: 156
22.12.2012, 21:26  [ТС] #11
А в качестве параметра функции можно передавать массив? И может ли функция возвращать структуру или массив?
Kastaneda
Форумчанин
Эксперт С++
4652 / 2860 / 228
Регистрация: 12.12.2009
Сообщений: 7,268
Записей в блоге: 2
Завершенные тесты: 1
22.12.2012, 21:29 #12
Цитата Сообщение от Max64 Посмотреть сообщение
А в качестве параметра функции можно передавать массив?
Можно передать указатель на массив. Сам массив можно передать "через одно место", но проще сказать, что нельзя.
Цитата Сообщение от Max64 Посмотреть сообщение
И может ли функция возвращать структуру или массив?
Опять же только указатель на массив. А структуру можно.
Max64
20 / 20 / 5
Регистрация: 27.10.2012
Сообщений: 156
22.12.2012, 21:31  [ТС] #13
Понятно, спасибо всем за помощь
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,924
Записей в блоге: 1
22.12.2012, 21:33 #14
В С++ раздельно компилируются СРР файлы, а затем собираются в один экзешник линковщиком.
В то же время Н файлы тупо прибавляются к тексту СРР, в которые заинклужены препроцессором.
Это значит, что при определении глобальной переменной в Н файле происходит сначала копирование этого определения во все СРР файлы, в которые он заинклюжен, затем успешная компиляция этих файлов компилятором, который не знает, что в файлах такие объявления теперь повторяются.
А затем линковщик обнаруживает это, и выдаёт ошибку ... already defined in main.obj

Чтобы это предотвратить надо
1) определить глобальные переменные только в одном СРР файле
2) не повторять это определение переменной нигде, кроме того файла, где сделал это в первый раз.
3) в заголовочном Н-файле сделать объявление этой переменной как внешней с помощью ключевого слова extern
C++
1
extern int x;
4) спокойно включать этот Н файл во все прочие СРР, в которых нужна переменная.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.12.2012, 21:33
Привет! Вот еще темы с ответами:

Заголовочный файл .h - C++
Здравствуйте уважаемые гуру-программисты! Столкнулся с такой проблемой. Пишу в С++ на линуксе в IDE geany и такая проблема, когда создаю...

Заголовочный файл. - C++
Доброго времени суток. Вопрос возник, по скольку в лекции по программированию ничего нет) я вроде как поняла что такое заголовочный...

ООП. header файл. Функцию объекта вынести в файл класса - C++
#ifndef DRAW_H #define DRAW_H #include &quot;mainwindow.h&quot; #include &quot;ui_mainwindow.h&quot; #include &lt;QFile&gt; #include &lt;QTextStream&gt; ...

Не подключается заголовочный файл - C++
Как подключить библиотеку #include &quot;array.h&quot;,очень нужно.Заранее спасибо) вот что выдает


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
22.12.2012, 21:33
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru