|
Велосипедист...
353 / 220 / 73
Регистрация: 15.12.2015
Сообщений: 785
|
|||||||||||||||||||||||||||||||
Раздельная компиляция. Связывание const-переменных07.09.2017, 13:34. Показов 5507. Ответов 70
Метки нет (Все метки)
Не совсем понимаю процесс раздельной компиляции, или то как работает связывание const-переменных. Имеется три файла:
const_test.h
const_test.cpp
general.cpp
Собственно, почему это не вызывает ошибку компиляции? ( Компилировал в VS 2013 ) Разве не должен был произойти конфликт имен, когда в файл "const_test.cpp" включился файл "const_test.h"? Ведь, как я понимаю, extern const int var; -- это отличная переменная от const int var = 10;. Теперь немного изменим код:const_test.h
const_test.cpp
general.cpp
Это уже ошибка. И это, по-моему нормально ( а по законам C++ нет? ), ведь инструкция extern int var; 1) порождает конфликт имен, 2) ссылается на несуществующую переменную ( ведь ни в одной единице трансляции не была объявлена внешняя int переменная с именем var ). В коде изменилось ( опять же таки, по моему мнению ) только то, что переменная var перестала быть const.P.S.: Знаю, что не умею доступно объяснять, но у здешних жителей форума, как показывает практика, хорошо развиты телепатические способности, проблем возникнуть не должно
1
|
|||||||||||||||||||||||||||||||
| 07.09.2017, 13:34 | |
|
Ответы с готовыми решениями:
70
Раздельная компиляция Раздельная компиляция раздельная компиляция |
|
17 / 16 / 3
Регистрация: 18.08.2017
Сообщений: 54
|
|||||||||||||
| 08.09.2017, 21:44 | |||||||||||||
|
Как тут не вспомнить известную русскую пословицу про танцора, которому всё мешает? Добавлю сюда ещё clang https://wandbox.org/permlink/VtaPdwC4zXeb0EHW
Ferrari F1, кому прояснит? Мне-то всё ясно. ;)
0
|
|||||||||||||
|
Велосипедист...
353 / 220 / 73
Регистрация: 15.12.2015
Сообщений: 785
|
||
| 09.09.2017, 03:57 [ТС] | ||
|
1. Следующие две переменные, определенные таким образом: int var_1 = 0;, extern const int var_2 = 0; имеют внешнее связывание, верно?2. Если мы хотим получить доступ к определенным выше переменным в соседней единице трансляции, мы должны написать следующее: extern int var_1; extern const int var_2;, верно?3. Когда нам нужно определить переменную с внутренним связываем, мы поступаем так: static int var_3 = 0; ( в случае с обычной переменной ) и static const int var_4 = 0; или const int var_4 = 0; ( в случае с константной переменной ), верно?Что мне остается непонятным: Если определение static const int var = 0; эквивалентно определению const int var = 0; ( имеет внутреннее связывание по умолчанию ), то почему последнее ( const int var = 0; ) будет трактоваться как определение выше объявленной внешней extern const int var; ( если таковая имеется )? Получается, const int var = 0; двусмысленно? Двусмысленно в том смысле, что когда выше есть объявление ( extern const int var; ) внешней константной переменной с таким же именем, const int var = 0; трактуется как определение этой переменной. Если же выше нет никаких объявлений внешних переменных, const int var = 0; трактуется как определение независимой переменной с внутренним связыванием? Вот именно этот момент мне непонятен.Добавлено через 1 минуту Извиняюсь перед всеми за дотошность. Ну или тупость. Я хочу освоить этот язык, поэтому должен добиться желаемого: узнать все как есть.
0
|
||
|
Вездепух
13235 / 6867 / 1827
Регистрация: 18.10.2014
Сообщений: 17,407
|
||||||||||||||||
| 09.09.2017, 04:13 | ||||||||||||||||
Сообщение было отмечено Captain Maxee как решение
РешениеОба объявления также являются определениями. Но в случае с const явно писать static не всегда обязательно. const переменная и так получит внутреннее связывание, если только она не объявлена как extern где-то в этой же единице трансляции.var в обоих случаях), говорит о том, что это - объявление одной и той же сущности, т.е. объявление одного и того же const объекта по имени var. Первое объявление явным образом назначило этому объекту внешнее связывание. После этого правило "внутреннее связывание по умолчанию" уже не применимо. Уже нет никакого "умолчания". Внешнее связывание было назначено явно.
const переменную с внешним связыванием. И только если переменная var в данной единице трансляции нигде явно не объявляется как extern, вступает в силу умолчательное правило - const переменная var получает внутреннее связывание.
3
|
||||||||||||||||
|
Велосипедист...
353 / 220 / 73
Регистрация: 15.12.2015
Сообщений: 785
|
|
| 09.09.2017, 04:25 [ТС] | |
|
TheCalligrapher, спасибо. Теперь все понятно.
Добавлено через 2 минуты Не по теме: GbaLog-, hoggy, теперь я понял, о чем вы писали. Мне нужно было просто разжевать, я не понимал.
0
|
|
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||||||||||||||||||
| 09.09.2017, 20:09 | |||||||||||||||||||
вы написали код, который содержит UB ))) и как тут теперь не вспомнить то про знаменитую пословицу? теперь, немножко ловкости рук, и никакой фантастики:
в чем здесь подвох? в строке:
1
|
|||||||||||||||||||
|
Вездепух
13235 / 6867 / 1827
Регистрация: 18.10.2014
Сообщений: 17,407
|
|||||||
| 09.09.2017, 20:26 | |||||||
int, проинициализированный значением 10. Ссылка ref привязывается к этому временному объекту и вся дальнейшая работа ведется именно с этим временным объектом. Адрес, который вы печатаете - это адрес этого временного объекта. Роль числового литерала 10 в этом коде заканчивается сразу после инициализации временного объекта. Все остальное, происходящее в этом коде к числовому литералу 10 никакого отношения не имеет.
1
|
|||||||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||||||||||
| 09.09.2017, 20:28 | ||||||||||||
|
с точки зрения синтаксиса. но не с точки зрения практического смысла. рассмотрим ещё раз этот самый мой пример:
адрес какого объекта выводится в консоль? если ниже вы допишите:
ответьте себе на эти вопросы, а затем заново внимательно прочитайте #23 который я написал специально для вас.
0
|
||||||||||||
|
Вездепух
13235 / 6867 / 1827
Регистрация: 18.10.2014
Сообщений: 17,407
|
|||||||
| 09.09.2017, 20:33 | |||||||
1
|
|||||||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||
| 09.09.2017, 20:35 | |||
|
у которого можно взять адрес. а значит, мы имеем полное право воспринимать циферки (числовые литеральные константы ) как полноценные prvalue объекты.
0
|
|||
|
17 / 16 / 3
Регистрация: 18.08.2017
Сообщений: 54
|
||||||||||
| 09.09.2017, 20:39 | ||||||||||
http://rextester.com/RJA75666 vc++, без оптимизаций http://rextester.com/SNLFL9050 vc++, с оптимизациями https://wandbox.org/permlink/ZDkg0jC8uRNrZyb1 g++, без https://wandbox.org/permlink/fPiM0vyJanSZ4blm g++, с
0
|
||||||||||
|
Вездепух
13235 / 6867 / 1827
Регистрация: 18.10.2014
Сообщений: 17,407
|
||
| 09.09.2017, 20:43 | ||
|
1
|
||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|
| 09.09.2017, 20:46 | |
|
0
|
|
|
17 / 16 / 3
Регистрация: 18.08.2017
Сообщений: 54
|
|
| 09.09.2017, 20:47 | |
|
0
|
|
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||
| 09.09.2017, 20:53 | |||
|
"мы получаем доступ к временному объекту, который и есть объект числовой константы" ? ничем. приведите мне хотя бы один пример ситуации, когда я не могу обращаться с числовыми литерными константами, как с prvalue. таких ситуаций нет. Добавлено через 2 минуты значение имеет стандарт языка. либо код содержит UB, либо лажают компиляторы.
0
|
|||
| 09.09.2017, 20:55 [ТС] | |
|
0
|
|
|
Вездепух
13235 / 6867 / 1827
Регистрация: 18.10.2014
Сообщений: 17,407
|
||
| 09.09.2017, 20:55 | ||
|
Единственный контекст, в котором эти понятия встречаются, т.е. в котором prvalue связано с так называемым "result object" - это prvalue типа "класс" или "массив". Prvalue типа int ни с каким объектом не связано. Но даже в тех случаях, когда "result object" существует, этот объект - это не само prvalue, а отдельный самостоятельный объект, лишь инициализированный при помощи этого prvalue.
2
|
||
|
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
|
||
| 09.09.2017, 20:58 | ||
|
Не хочу ввязываться в эти бесполезные споры, только уточню насчет этого:
Object Lifetime. Поэтому то, что второй объект разместился в памяти первого после его смерти, нельзя назвать лажей компилятора.
2
|
||
| 09.09.2017, 21:00 [ТС] | |
|
Не по теме: Эти беседы напоминают спор про: "Стакан наполовину полон или наполовину пуст?" :stop:
0
|
|
| 09.09.2017, 21:00 | |
|
Раздельная компиляция Шаблоны и раздельная компиляция Раздельная компиляция файлов Раздельная компиляция и шаблоны Раздельная компиляция и шаблоны Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Генератор паролей (вариант №1)
Maks 29.10.2026
Реализация из решения ниже выполнена исключительно по моей инициативе.
Самым главным критерием для меня было создание паролей, в котором отсутствуют знаки: | 1 l I
Обработка содержит следующие. . .
|
Установка ChatGPT (Codex) на Windows без использования Microsoft Store
Fabien159 28.10.2026
Здравствуйте всем читающим! Опишу процесс установки ChatGPT (Codex) на Windows, если по каким-то причинам у вас не получается устанавить его через Microsoft Store.
И так:
1. Скачиваем с. . .
|
Программное добавление префикса в нумерацию документов
Maks 27.10.2026
Реализация из решения ниже выполнена в самописной конфигурации на БСП (помощь начинающему коллеге).
Задача:
Программно добавить префикс в нумерацию документов.
Решение:
В модуле объекта. . .
|
После закрытия оутлука продолжает висеть процесс в диспетчере задач
Maks 27.10.2026
С недавнего времени в продакшене возникла проблема: при закрытии оутлука в диспетчере задач продолжал висеть процесс outlook. exe. Проблема возникла после установки MS Office 2021 LTSC на машинах, под. . .
|
|
Baragoz - DPS/HPS бот для WoW 3.3.5a, многоязычный
AmbA 26.10.2026
Хотите ещё ботов? У меня есть один! А я пока отдохну от него.
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=12062&stc=1&d=1793007952
Инструкция внутри.
https:/ / youtu. be/ VpfFZSUDGnQ. . .
|
Особенности gif сгенерированных в Си
russiannick 21.10.2026
Рассмотрим генерацию gif файлов, которые в Си имеют свои особенности.
Gif представляет собой графический формат популярный в интернете. Посмотрим на палитру. Gif файл сгенерированный в си отличается. . .
|
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version
Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
|
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер
На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
|