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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.75
Intel~lect
135 / 124 / 2
Регистрация: 03.07.2012
Сообщений: 355
#1

Переменные в отдельном файле - C++

10.08.2012, 15:50. Просмотров 1863. Ответов 11
Метки нет (Все метки)

Есть вот такая программка из нескольких файлов. Компилируется без ошибок. А сам вопрос в комментарии.

file01.h
C++
1
2
3
4
5
6
7
8
9
#ifndef FILE01_H_
#define FILE01_H_
 
// определение переменных
int cats = 20;
int dogs = 22;
int fleas = 1;      
 
#endif
file02.h
C++
1
2
3
4
5
6
7
8
9
#ifndef FILE02_H_
#define FILE02_H_
 
// Почему переменные, которые определены в file01.h доступны в этом файле?
void mul_cats_2()   { cats *= 2; }
void mul_dogs_2()   { dogs *= 2; }
void mul_fleas_2()  { fleas *= 2; }
 
#endif
main
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
#include <windows.h>
#include "file01.h"
#include "file02.h"
using namespace std;
 
int main()
{
    setlocale(0, "");
 
    cout << "cats  = "  << cats  << endl;
    cout << "dogs  = "  << dogs  << endl;
    cout << "fleas = "  << fleas << endl << endl;
 
    mul_cats_2();
    mul_dogs_2();
    mul_fleas_2();
 
    cout << "cats  = "  << cats  << endl;
    cout << "dogs  = "  << dogs  << endl;
    cout << "fleas = "  << fleas << endl << endl;
 
 
    system("pause");
    return 0;
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.08.2012, 15:50
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Переменные в отдельном файле (C++):

Функция в отдельном файле - C++
Всем привет! Учусь писать код в разных файлах, возникла проблема с подобным кодом: main.cpp #include &lt;iostream&gt; #include...

Реализация класса в отдельном файле - C++
Изучаю C++ (вернее только начал) по учебнику &quot;Харви М. Дейтел, Пол Дж. Дейтел - Как программировать на C++&quot; и застрял на создании классов в...

Как разместить 2 поиска в отдельном заголовочном файле - C++
Как разместить 2 поиска в отдельном заголовочном файле?? Создать файл содержащий сведения о результатах охоты. Данные должны быть...

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

Опять про реализацию класса в отдельном файле - C++
Допустимо ли следующее? есть проект в Visual Studio 2010. в нем следующие файлы: main.cpp - собссно программа MyClass.h -...

LNK2019 при вызове метода в отдельном файле - C++
Здравствуйте! У меня такая проблема- линкер жалуется на:error LNK2019: unresolved external symbol &quot;public: char * __thiscall Param&lt;char...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
PSIAlt
86 / 86 / 8
Регистрация: 19.06.2012
Сообщений: 245
10.08.2012, 15:52 #2
Потому что они глобальные. Если сделаешь static int cats то будет в пределах файла. А вообще - заводить глобальные переменные это моветон.
1
Intel~lect
135 / 124 / 2
Регистрация: 03.07.2012
Сообщений: 355
10.08.2012, 15:56  [ТС] #3
Цитата Сообщение от PSIAlt Посмотреть сообщение
Потому что они глобальные.
Но ведь нет никакой связи между file01.h и file02.h Это просто два отдельных файла.
0
cossack5
54 / 48 / 1
Регистрация: 02.08.2012
Сообщений: 127
10.08.2012, 15:57 #4
Они доступны, потому что вы включаете файл file01.h (где они объявлены) перед файлом file02.h (где они используются). Если сделать наоборот, то работать не будет. Если и объявлять глобальные переменные, то лучше делать это в cpp файлах, в противном случае, если вы включаете файл с объявлениями по несколько раз в разные файлы, вы получите ошибки компоновщика "символ ... уже определен в файле ..." (никакие include guards не помогут).
1
Intel~lect
135 / 124 / 2
Регистрация: 03.07.2012
Сообщений: 355
10.08.2012, 16:08  [ТС] #5
Цитата Сообщение от cossack5 Посмотреть сообщение
Они доступны, потому что вы включаете файл file01.h (где они объявлены) перед файлом file02.h (где они используются). Если сделать наоборот, то работать не будет.
Да, все правильно. Сейчас поменял местами #include "file01.h" и #include "file02.h". программа кучу ошибок выдала Спасибо всем за помощь. Теперь все стало понятно.
0
cossack5
54 / 48 / 1
Регистрация: 02.08.2012
Сообщений: 127
10.08.2012, 16:10 #6
Хотя иногда так можно делать (если включать файл по одному разу), чтобы разбить очень большие cpp на несколько небольших модулей.
0
Intel~lect
135 / 124 / 2
Регистрация: 03.07.2012
Сообщений: 355
10.08.2012, 16:16  [ТС] #7
А кто знает, вот PSIAlt написал если сделать их static, то эти переменные будут только в пределах файла. Я вот сейчас сделал все эти переменные static и программа все равно скомпилировалась без ошибок. В чем секрет?
0
cossack5
54 / 48 / 1
Регистрация: 02.08.2012
Сообщений: 127
10.08.2012, 16:20 #8
Цитата Сообщение от Intel~lect Посмотреть сообщение
А кто знает, вот PSIAlt написал если сделать их static, то эти переменные будут только в пределах файла. Я вот сейчас сделал все эти переменные static и программа все равно скомпилировалась без ошибок. В чем секрет?
Static позволяет использовать переменную только в том файле где она объявлена, если файл не .h (cpp, c). В другие (cpp,c) она уже не попадает. Посмотрите здесь: http://msdn.microsoft.com/en-us/libr...(v=vs.80).aspx.
1
Intel~lect
135 / 124 / 2
Регистрация: 03.07.2012
Сообщений: 355
10.08.2012, 17:52  [ТС] #9
cossack5, Спасибо! С этим вопросом все понятно.

Добавлено через 1 час 18 минут
Опять у меня с этой программой какие-то непонятные вещи происходят.
Цитата Сообщение от cossack5 Посмотреть сообщение
Static позволяет использовать переменную только в том файле где она объявлена, если файл не .h (cpp, c). В другие (cpp,c) она уже не попадает.
У меня все наоборот. Создал новый проект, только вместо .h файлов сделал .cpp файлы и все переменные static. Но они все равно видны в другом .cpp файле .
Подскажите кто-нибудь как сделать чтобы эти переменные были видны только в одном файле.

file01.cpp
C++
1
2
3
static int cats = 20;
static int dogs = 22;
static int fleas = 1;
file02.cpp
C++
1
2
3
void mul_cats_2()   { cats *= 2; }
void mul_dogs_2()   { dogs *= 2; }
void mul_fleas_2()  { fleas *= 2; }
main
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <windows.h>
#include "file01.cpp"
#include "file02.cpp"
using namespace std;
 
int main()
{
    mul_cats_2();
    mul_dogs_2();
    mul_fleas_2();
 
    system("pause");
    return 0;
}
Эта программа почему-то компилируется. А по правилам не должна. Потому что переменные cats, dogs и fleas статические и не должны быть видны в другом .cpp файле.
0
cossack5
54 / 48 / 1
Регистрация: 02.08.2012
Сообщений: 127
10.08.2012, 18:56 #10
Не то хотел сказать. Я имел ввиду что переменная static не будет видна через слово extern. Так обычно глобальные нестатичные переменные связывают в пределах одного проекта.
Например,
C++
1
2
3
4
5
6
7
8
9
10
11
12
file01.h
extern int cats; 
file01.cpp
int cats=5; // объявили переменную
main.cpp 
#include "file01.h"
 
int main()
{
cats=5; // эта переменная известна компилятору (т.к. есть в файле file01), но неизвестна компоновщику.
return 0;
}
В вашем же случае все правильно с точки зрения синтаксиса и т.д.
0
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
10.08.2012, 20:26 #11
C++
1
2
#include "file01.cpp"
#include "file02.cpp"
Аще отлично включать С++ файлы, мда-мс. static перед переменной говорит, что у нее статическая линковка (доступна линкеру только в пределах этого файла).
1
Intel~lect
135 / 124 / 2
Регистрация: 03.07.2012
Сообщений: 355
10.08.2012, 21:53  [ТС] #12
ForEveR, .cpp файлы включал только ради эксперимента, будет программа рабатать или нет
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.08.2012, 21:53
Привет! Вот еще темы с ответами:

Объявление функции в отдельном файле (Code::Blocks) - C++
Разбираю объявление функций в отдельных файлах на примере задачи о проверке - является ли пятизначное число палиндромом, т.е. таким числом,...

Деструктор шаблона описанный в отдельном файле не линкуется. Почему? - C++
Есть такой код: файл &quot;a.h&quot; #include &lt;iostream&gt; template &lt; typename T&gt; class A { public: A() { a=0; std::cout &lt;&lt;&quot;c A&quot;&lt;&lt;...

Реализовать определение нового класса в отдельном файле (библиотека пользователя) - C++
1. Реализовать определение нового класса в отдельном файле (библиотека пользователя). 2. Обязательно должны быть реализованы следующие...

Описание функции шаблонного класса библиотеки в отдельном cpp-файле - C++
Есть библиотека. В файле ARRAYLIST.HPP описан шаблон template &lt;typename _Type&gt; class ArrayList { private: int length; ...


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

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

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