|
Велосипедист...
353 / 220 / 73
Регистрация: 15.12.2015
Сообщений: 785
|
|||||||||||||||||||||||||||||||
Раздельная компиляция. Связывание const-переменных07.09.2017, 13:34. Показов 5512. Ответов 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
|
||||||||||||||||||||||||||||||||
|
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
|
|
| 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
|
|
|
Вездепух
13235 / 6867 / 1827
Регистрация: 18.10.2014
Сообщений: 17,407
|
|||
| 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
|
|
|
Вездепух
13235 / 6867 / 1827
Регистрация: 18.10.2014
Сообщений: 17,407
|
|
| 08.09.2017, 20:30 | |
Сообщение было отмечено GbaLog- как решение
Решение
Тема "литералов" и "взятия адреса" тут уже много раз обсуждалась.
Оператор взятия адреса разрешается применять только к lvalue-выражениям. Выражение, состящее из имени переменной либого типа (константной или нет) является lvalue, поэтому его адрес можно брать. Выражение, состящее из имени enum-константы не является lvalue, поэтому его адрес брать нельзя. У enum-константы никакого адреса нет и быть не может. Выражение, состящее из встроенного литерала, не является lvalue, поэтому его адрес брать нельзя (за исключением строковых литералов). У числового литерала никакого адреса нет и быть не может. Выражение, состящее из строкового литерала, является lvalue. У строковых литералов есть адреса.
3
|
|
| 08.09.2017, 20:30 | |
|
Раздельная компиляция Шаблоны и раздельная компиляция Раздельная компиляция файлов Раздельная компиляция и шаблоны Раздельная компиляция и шаблоны Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С.
Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
|
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию?
Фраза «Любая достаточно развитая технология неотличима от магии». . .
|
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль?
Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
|
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология.
«Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
|
|
Генератор паролей (вариант №2)
Maks 30.10.2026
Обновленная версия ранее созданной обработки.
Добавлены следующие реквизиты типа Булево:
- Буквы;
- Цифры;
- Символы.
Изменена логика команды "Сгенерировать" и процедуры "ПриОткрытии":. . .
|
Генератор паролей (вариант №1)
Maks 29.10.2026
Реализация из решения ниже выполнена исключительно по моей инициативе, дабы облегчить себе работу в создании паролей для администрируемых мною сервисов и пользователей.
Самым главным критерием для. . .
|
Установка ChatGPT (Codex) на Windows без использования Microsoft Store
Fabien159 28.10.2026
Здравствуйте всем читающим! Опишу процесс установки ChatGPT (Codex) на Windows, если по каким-то причинам у вас не получается устанавить его через Microsoft Store.
И так:
1. Скачиваем с. . .
|
Программное добавление префикса в нумерацию документов
Maks 27.10.2026
Реализация из решения ниже выполнена в самописной конфигурации на БСП (помощь начинающему коллеге).
Задача:
Программно добавить префикс в нумерацию документов.
Решение:
В модуле объекта. . .
|