|
Велосипедист...
353 / 220 / 73
Регистрация: 15.12.2015
Сообщений: 785
|
|||||||||||||||||||||||||||||||
Раздельная компиляция. Связывание const-переменных07.09.2017, 13:34. Показов 5113. Ответов 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
Раздельная компиляция Раздельная компиляция раздельная компиляция |
| 07.09.2017, 17:35 | ||||||
|
hoggy,
static приписывать? получается, что мы совмещаем сишный и плюсовый подход касательно внутреннего связывания, хотя достаточно выбрать одно из двух(либо безымянный namespace, либо static)
1
|
||||||
|
Любитель чаепитий
|
|||||||
| 07.09.2017, 17:35 | |||||||
а у констант есть, они ничем не отличаются от обычных переменных, кроме того факта, что их изменять нельзя. P.S. если я не прав, то приведите пункт стандарта, где мой выпад распадается в пух и прах.
0
|
|||||||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||||||||
| 07.09.2017, 18:30 | |||||||||
|
лично я предпочитаю безымянный неймспейс, как более универсальное средство Добавлено через 14 секунд лично я предпочитаю безымянный неймспейс, как более универсальное средство Добавлено через 9 минут и у литерных, и у числовых, и у енумовских констант можно брать адрес. равно как у константной переменной. в этом моменте, между вторым и тьретьим разницы вообще нет никакой. между константной переменной и числовой константой (или енумом) различие заключается в том, что адрес у них можно срисовать лишь опосредованно, через ссылку:
0
|
|||||||||
|
Любитель чаепитий
|
||
| 07.09.2017, 19:31 | ||
val.так что нет адресов у них, они подставляются в коде. у строковых литералов можно брать адрес потому, что они особенные и это такая оптимизация, что они располагаются в статической памяти. но это тоже происходит не всегда. слышал о случаях, когда они просто в ассемблер встраивались обычными числами.
0
|
||
| 07.09.2017, 19:32 | |
|
0
|
|
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||
| 07.09.2017, 19:37 | |||
|
есть аргумент-ссылка 'val' которая обозначает объект, переданный в функцию снаружи. операция взятия адреса у ссылки - есть операция взятия адреса у оргинального объекта. возвращаемый указатель будет хранить адрес объекта, переданного в функцию. синтаксис- первичен. адрес литерной строки можно брать просто потому, что можно - таковы правила игры. всегда.
0
|
|||
|
Любитель чаепитий
|
||||
| 07.09.2017, 19:46 | ||||
|
по не константной ссылке попробуйте передать и как бы будет как бы ошибка как бы компиляции. константная ссылка просто продлевает жизнь объекта, который создаётся на входе в функцию. это всё. никаких адресов у rvalue не существует, с точки зрения стандарта. http://en.cppreference.com/w/c... e_category
компилятор вправе применить оптимизации, если это никак не повлияет на результат программы.
0
|
||||
|
Велосипедист...
353 / 220 / 73
Регистрация: 15.12.2015
Сообщений: 785
|
||||||||||||||||||||||||||||||||
| 07.09.2017, 20:02 [ТС] | ||||||||||||||||||||||||||||||||
|
Вариант 1: const_test.h
const_test.cpp
general.cpp
Вариант 2: const_test.h
const_test.cpp
general.cpp
Первый вариант вызывает ошибку компиляции, а второй вариант компилируется успешно, создаются две независимые переменные var.
0
|
||||||||||||||||||||||||||||||||
|
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
|
|
| 07.09.2017, 21:22 | |
|
Вот две полезные темы, для внимательного прочтения:
Несколько *.cpp и глобальные переменные Extern в C/C++
0
|
|
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||
| 08.09.2017, 02:08 | |||
|
и не более того. в представленном мой способе, передается lvalue. rvalue прекрасно конвертится в lvalue, когда lvalue - обозначает константу. при этом адрес самого объекта никак не меняется. а компилятор, видя, факт самой возможности взятия адреса, обязан честно наделить константу этим самым адресом - расположить объект по адресу, который честным образом можно взять. Добавлено через 1 минуту и что именно вы хотели показать своими примерами
0
|
|||
|
70 / 70 / 35
Регистрация: 06.07.2016
Сообщений: 415
|
|
| 08.09.2017, 07:52 | |
|
Fulcrum_013,
Неверно. Константа является обычной переменной, для которой выделяется память, а не подставляемым значением, если : 1.Где либо в программе берется ее адрес. 2.Она является "внешней констаной", объявленной с extern. 3.В некоторых других случаях, о которых непосредственно можно узнать из документации компилятора. "Философия С++", Брюс Эккель.
0
|
|
|
17 / 16 / 3
Регистрация: 18.08.2017
Сообщений: 54
|
|||||||||||||
| 08.09.2017, 18:26 | |||||||||||||
0x, но для простоты забудем про них). Что такое адрес числового литерала? Смещение в файле с исходным кодом?https://wandbox.org/permlink/K7BSiLhI9m2m4327
0
|
|||||||||||||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|
| 08.09.2017, 18:37 | |
|
0
|
|
|
Вездепух
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,306
|
|||
| 08.09.2017, 18:48 | |||
const переменной с внешним связыванием.var имеет внешнее связывание. Так как вы включили const_test.h в const_test.cpp, в этом месте видно предыдущее объявление var как переменной с внешним связыванием. Оно теперь так и останется внешним, как было изначально объявлено. "Отменить" внешнее связывание уже не получится.А в main вы просто успешно линкуетесь к этой переменной с внешним связыванием.А вот если убрать включение const_test.h именно из const_test.cpp, тогда это определение в const_test.cpp действительно создаст переменную с внутренним связыванием и программа перестанет линковаться.
1
|
|||
|
17 / 16 / 3
Регистрация: 18.08.2017
Сообщений: 54
|
|||||||||||||
| 08.09.2017, 19:07 | |||||||||||||
|
http://rextester.com/DPFY59334
0
|
|||||||||||||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||
| 08.09.2017, 19:19 | |||
|
уберите ключик /Ox Добавлено через 1 минуту вполне себе полноценные. внезапно?
0
|
|||
|
17 / 16 / 3
Регистрация: 18.08.2017
Сообщений: 54
|
|||
| 08.09.2017, 19:30 | |||
|
А когда кто-то водит руками и пишет нечто, чье поведение зависит от оптимизаций, это говорит только о непонимании языка. За литералом 10 самим-по-себе нет никакого объекта. И адрес у него взять нельзя.
0
|
|||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||||||
| 08.09.2017, 19:34 | ||||||||
0
|
||||||||
| 08.09.2017, 19:37 | |
|
0
|
|
|
Вездепух
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,306
|
|
| 08.09.2017, 20:30 | |
Сообщение было отмечено GbaLog- как решение
Решение
Тема "литералов" и "взятия адреса" тут уже много раз обсуждалась.
Оператор взятия адреса разрешается применять только к lvalue-выражениям. Выражение, состящее из имени переменной либого типа (константной или нет) является lvalue, поэтому его адрес можно брать. Выражение, состящее из имени enum-константы не является lvalue, поэтому его адрес брать нельзя. У enum-константы никакого адреса нет и быть не может. Выражение, состящее из встроенного литерала, не является lvalue, поэтому его адрес брать нельзя (за исключением строковых литералов). У числового литерала никакого адреса нет и быть не может. Выражение, состящее из строкового литерала, является lvalue. У строковых литералов есть адреса.
3
|
|
| 08.09.2017, 20:30 | |
|
Раздельная компиляция Шаблоны и раздельная компиляция Раздельная компиляция файлов Раздельная компиляция и шаблоны Раздельная компиляция и шаблоны Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
сукцессия 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), направленная на устранение нефизичных артефактов (коллапс биомассы, мгновенное. . .
|