|
Велосипедист...
353 / 220 / 73
Регистрация: 15.12.2015
Сообщений: 785
|
|||||||||||||||||||||||||||||||
Раздельная компиляция. Связывание const-переменных07.09.2017, 13:34. Показов 5087. Ответов 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 | |
|
Раздельная компиляция Шаблоны и раздельная компиляция Раздельная компиляция файлов Раздельная компиляция и шаблоны Раздельная компиляция и шаблоны Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
GitDOS: Когда я решил скрестить MS-DOS, GitHub и Claude
MaGz GoLd 08.07.2026
Привет, Киберфорум! Хочу поделиться своим проектом, который, надеюсь, вас заинтересует. GitDOS — это веб-приложение, которое позволяет запускать DOS в браузере с тремя крутыми фичами: диски живут в. . .
|
Учебный мини "цифровой двойник" = (Сервер = Java + Flask_питон )+(3D = Гугловскаая 4T nvideo + google colab) +( WMS = Odoo на Docker)
anaschu 07.07.2026
Увидел в требованиях к вакансии создателя имитационных моделей связку (REst + Api + WMS + Anylogic + питон + 3D Nvideo), и решил посмотреть, что это такое. Из этого всего я работал более менее. . .
|
Море в объективе
kumehtar 06.07.2026
Хотел написать много проникновенных слов, но передумал.
Оно само - говорит.
Кто слышит тот слышит.
|
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было
ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась.
Первый вариант. . .
|
|
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2.
Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
|
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет.
Но обычно это 50 лет и более.
Наверное, закисление почвы происходит сезонно в средней. . .
|
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
|
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS
Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
|