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

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

Войти
Регистрация
Восстановить пароль
 
WindSlasher
0 / 0 / 0
Регистрация: 22.06.2013
Сообщений: 34
#1

Область видимости файла - C++

07.02.2014, 23:44. Просмотров 361. Ответов 4
Метки нет (Все метки)

Мне не дает покоя вот такой вопрос:

Проект состоит из нескольких файлов .cpp. Есть несколько .h файлов, содержащих определения классов, функций и макросы(#define...).

Насколько я знаю, директивы препроцессора работают до перевода исходников в .obj файлы, следовательно .cpp файлы расширяются включаемыми файлами .h, а затем преобразуются в объектные файлы - .obj и потом линковщик соединяет объектные файлы в .exe.

У каждого .cpp файла, преобразованного в .obj будет своя область видимости? Т.е. если я определю глобальную константу в одном .cpp файле, то остальные файлы ее не увидят без extern?

Добавлено через 14 минут
Что-то я запутался...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.02.2014, 23:44
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Область видимости файла (C++):

Область видимости - C++
Здравствуйте. Тут такое дело: #include <vector> class SomeClass { public: SomeClass( std::vector< int > v ) : vec( v ) {} ...

Область видимости - C++
У меня возникла проблема с областью видимости. вот у меня два класса class Obj { public: Win *parent;

Область видимости - C++
func { int someVariable; { int someVariable; //можно ли как нибудь получить доступ к переменной...

Область видимости в С++ - C++
В книге С++ Бархатный путь. ( http://khpi-iip.mipk.kharkiv.edu/library/extent/prog/cppvw/cpp_047.html) сказано, что область действия имен...

Область видимости - C++
Даю фрагмент программы: #include <iostream> #include <stdio.h> #include <cmath> struct elem //тип элемента двусвязного списка ...

Область видимости и указатели - C++
Разбираю пример Иногда возникают ситуации, когда значение локальной переменной за пределами блока, в котором она объявлена. Как быть...

4
DU
1483 / 1129 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
07.02.2014, 23:58 #2
запись "const int GlobalVar;" в h или в cpp - это объявление и определение константной переменной.
поэтому если вы во всех местах, где используете глобальную переменную так напишете -
у линкера будут проблемы с тем, что в разных объектниках, из которых он пытается скопмоновать
выполняемый бинарь - есть одинаковое имя. и он не сможет сделать то, что должен, т.к.
все эти объекты с одинаковым именем для него равнозначны. он не знает какой выбрать для
линковки. c ключевым словом extern получается вроде как объявление а не определение.
0
alsav22
5421 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
08.02.2014, 03:27 #3
Цитата Сообщение от DU Посмотреть сообщение
запись "const int GlobalVar;" в h или в cpp - это объявление и определение константной переменной.
Так не записать, нужно инициализировать.
Цитата Сообщение от DU Посмотреть сообщение
поэтому если вы во всех местах, где используете глобальную переменную так напишете -
у линкера будут проблемы с тем, что в разных объектниках, из которых он пытается скопмоновать
выполняемый бинарь - есть одинаковое имя. и он не сможет сделать то, что должен
С глобальными константами такой проблемы не будет, т.к. у них внутреннее связывание.
Добавлено через 44 секунды
Цитата Сообщение от WindSlasher Посмотреть сообщение
Т.е. если я определю глобальную константу в одном .cpp файле, то остальные файлы ее не увидят без extern?
Да (только не файлы не увидят, а компилятор не увидит, потому что в единицу времени компилятор видит только один модуль) (компоновщик увидит)), и не только глобальную константу, но и неконстантную глобальную переменную.
0
WindSlasher
0 / 0 / 0
Регистрация: 22.06.2013
Сообщений: 34
08.02.2014, 04:45  [ТС] #4
alsav22,

Да (только не файлы не увидят, а компилятор не увидит, потому что в единицу времени компилятор видит только один модуль) (компоновщик увидит)), и не только глобальную константу, но и неконстантную глобальную переменную.
Это справедливо, только если объектные модули связаны напрямую, а не через их .h интерфейсы?

У меня, модуль состоит из .cpp и .h файлов. В .h содержатся определения классов, функций, а в .cpp - их реализации. Связываются эти объектные модули через свои .h файлы. Коллизия имен, в таком случае, может возникнуть только, если имена глобальные переменные в .h файлах имеют одинаковые дескрипторы(имена)?
0
alsav22
5421 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
08.02.2014, 05:50 #5
Цитата Сообщение от WindSlasher Посмотреть сообщение
Это справедливо, только если объектные модули связаны напрямую, а не через их .h интерфейсы?
Ни через что они не связаны, это просто образное выражение. Модуль - это единица компиляции (.cpp файл).
.h файлы - они же не сами по себе? Текст .h файлов, через include, добавляется, перед компиляцией, к тексту .cpp файла. Получается один модуль.
Цитата Сообщение от WindSlasher Посмотреть сообщение
Коллизия имен, в таком случае, может возникнуть только, если имена глобальные переменные в .h файлах имеют одинаковые дескрипторы(имена)?
В .h файлах, не в .h файлах, не суть важно. И дело не в именах, а в определениях переменных (выделении под них памяти; напишу то же имя с extern и уже нет определения, а только объявление). Если у переменной внешнее связывание (например, глобальная неконстантная переменная), то такая переменная должна иметь только одно определение во всех файлах, которые видит компоновщик. Если сделать такое определение в одном из .h файлов, а потом подключить его к нескольким .cpp, то получится уже несколько определений, что вызовет ошибку компоновщика: множественное определение. Поэтому и не делают в .h файлах реализации (определения) таких переменных (или функций), за исключением шаблонов (но это и не реализации - память не выделяется).
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.02.2014, 05:50
Привет! Вот еще темы с ответами:

Область видимости переменных - C++
Как использовать одну переменную в нескольких файлах, если эта переменная задана только в одном. Файлы между собой связаны Добавлено...

Область видимости в библиотеках - C++
Есть 2 либы с одинаковыми классами Первая: ----file t1.h ----- #ifndef LOG1_H #define LOG1_H #include <string>

Область видимости переменной - C++
Пожалуйста проясните новичку почему следующий код выводит сообщение messagebeer вместо message ? ]:->. Я только осваиваю язык поэтому хочу...

область видимости класса - C++
А почему у меня ошибку выдает? Не могу понять using namespace std; class Base { int a; public: Base(int aa) { a = aa; } ...


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

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

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