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

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

Восстановить пароль Регистрация
 
WindSlasher
 Аватар для WindSlasher
0 / 0 / 0
Регистрация: 22.06.2013
Сообщений: 34
07.02.2014, 23:44     Область видимости файла #1
Мне не дает покоя вот такой вопрос:

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

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

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

Добавлено через 14 минут
Что-то я запутался...
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.02.2014, 23:44     Область видимости файла
Посмотрите здесь:

Область видимости в С++ C++
Область видимости C++
Область видимости переменной C++
C++ Область видимости
Область видимости переменных C++
Область видимости C++
C++ Область видимости
Область видимости и указатели C++
C++ Область видимости в библиотеках
Область видимости переменных C++
Область видимости в классах C++
область видимости класса C++

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

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

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

У меня, модуль состоит из .cpp и .h файлов. В .h содержатся определения классов, функций, а в .cpp - их реализации. Связываются эти объектные модули через свои .h файлы. Коллизия имен, в таком случае, может возникнуть только, если имена глобальные переменные в .h файлах имеют одинаковые дескрипторы(имена)?
alsav22
5284 / 4803 / 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 файлах реализации (определения) таких переменных (или функций), за исключением шаблонов (но это и не реализации - память не выделяется).
Yandex
Объявления
08.02.2014, 05:50     Область видимости файла
Ответ Создать тему
Опции темы

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