|
Велосипедист...
353 / 220 / 73
Регистрация: 15.12.2015
Сообщений: 785
|
|||||||||||||||||||||||||||||||
Раздельная компиляция. Связывание const-переменных07.09.2017, 13:34. Показов 5110. Ответов 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
|
||
|
Вездепух
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,306
|
||||||||||||||||
| 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
|
|||||||||||||||||||
|
Вездепух
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,306
|
|||||||
| 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
|
||||||||||||
|
Вездепух
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,306
|
|||||||
| 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
|
||||||||||
|
Вездепух
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,306
|
||
| 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
|
|
|
Вездепух
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,306
|
||
| 09.09.2017, 20:55 | ||
|
Единственный контекст, в котором эти понятия встречаются, т.е. в котором prvalue связано с так называемым "result object" - это prvalue типа "класс" или "массив". Prvalue типа int ни с каким объектом не связано. Но даже в тех случаях, когда "result object" существует, этот объект - это не само prvalue, а отдельный самостоятельный объект, лишь инициализированный при помощи этого prvalue.
2
|
||
|
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
|
||
| 09.09.2017, 20:58 | ||
|
Не хочу ввязываться в эти бесполезные споры, только уточню насчет этого:
Object Lifetime. Поэтому то, что второй объект разместился в памяти первого после его смерти, нельзя назвать лажей компилятора.
2
|
||
| 09.09.2017, 21:00 [ТС] | |
|
Не по теме: Эти беседы напоминают спор про: "Стакан наполовину полон или наполовину пуст?" :stop:
0
|
|
| 09.09.2017, 21:00 | |
|
Раздельная компиляция Шаблоны и раздельная компиляция Раздельная компиляция файлов Раздельная компиляция и шаблоны Раздельная компиляция и шаблоны Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров
В текущей версии модели успешно реализован ключевой механизм. . .
|
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям
Реализованные компоненты:
Механизм закисления почвы через протонную помпу
Конкуренция между типами микориз
pH как триггер сукцессии
C/ P соотношение. . .
|
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
|
Решил проблему с ошибкой пагинации сообщений с сервера на алгоритме обхода дерева "Эстафета хвоста".
Hrethgir 12.07.2026
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
|
|
сукцессия 25. Хронология ошибок
anaschu 12.07.2026
# От 50-тонного гриба до устойчивого леса: хроника ошибок при построении модели вековой сукцессии микоризы
## О чём эта статья
В процессе построения ОДУ-модели (система дифференциальных. . .
|
сукцессия 24. Промежуточное общее описание модели
anaschu 12.07.2026
Хендофф: модель АМ→ЭКМ сукцессии микоризы (ризосфера, 50 лет)
Содержание проекта
Симуляция вековой (50 лет) экологической сукцессии в почве леса
Основные участники: АМ-гриб, ЭКМ-гриб,. . .
|
сукцессия 23. Более физиологичная физиология, более экологичная экология, более диффурные диффуры.
anaschu 12.07.2026
Что реально нашли и починили за эти 5 часов
Правило Линдемана (КПД конверсии сахара в тело, kEff) — раньше 100% полученного углерода шло прямо в биомассу гриба; теперь только kEff=0. 5 (после. . .
|
сукцессия 22. От артефактов к физиологии: калибровка агентной модели грибной сукцессии для воспроизведения сезонной динамики и pH-плато
anaschu 11.07.2026
Аннотация
В данной работе представлена калибровка агентной модели динамики грибных сообществ (fungal-succession), направленная на устранение нефизичных артефактов (коллапс биомассы, мгновенное. . .
|