Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.67/21: Рейтинг темы: голосов - 21, средняя оценка - 4.67
Велосипедист...
 Аватар для Mournful Max
353 / 220 / 73
Регистрация: 15.12.2015
Сообщений: 785

Раздельная компиляция. Связывание const-переменных

07.09.2017, 13:34. Показов 5081. Ответов 70
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Не совсем понимаю процесс раздельной компиляции, или то как работает связывание const-переменных. Имеется три файла:
const_test.h
C++
1
2
3
4
5
6
7
#ifndef CONST_TEST_H_
#define CONST_TEST_H_
 
extern const int var;  // Это почему работает?
void func( void );
 
#endif  // CONST_TEST_H_

const_test.cpp
C++
1
2
3
4
5
6
7
8
9
#include <iostream>
#include "const_test.h"
 
const int var = 10;  // var имеет внутреннее связывание
 
void func( void )
{
    std::cout << &var << std::endl;
}

general.cpp
C++
1
2
3
4
5
6
7
8
#include <iostream>
#include "const_test.h"
 
int main()
{
    std::cout << &var << std::endl;
    func();
}

Собственно, почему это не вызывает ошибку компиляции? ( Компилировал в VS 2013 ) Разве не должен был произойти конфликт имен, когда в файл "const_test.cpp" включился файл "const_test.h"? Ведь, как я понимаю, extern const int var; -- это отличная переменная от const int var = 10;. Теперь немного изменим код:
const_test.h
C++
1
2
3
4
5
6
7
#ifndef CONST_TEST_H_
#define CONST_TEST_H_
 
extern int var;
void func( void );
 
#endif  // CONST_TEST_H_

const_test.cpp
C++
1
2
3
4
5
6
7
8
9
#include <iostream>
#include "const_test.h"
 
static int var = 10;
 
void func( void )
{
    std::cout << &var << std::endl;
}

general.cpp
C++
1
2
3
4
5
6
7
8
#include <iostream>
#include "const_test.h"
 
int main()
{
    std::cout << &var << std::endl;
    func();
}

Это уже ошибка. И это, по-моему нормально ( а по законам C++ нет? ), ведь инструкция extern int var; 1) порождает конфликт имен, 2) ссылается на несуществующую переменную ( ведь ни в одной единице трансляции не была объявлена внешняя int переменная с именем var ). В коде изменилось ( опять же таки, по моему мнению ) только то, что переменная var перестала быть const.

P.S.: Знаю, что не умею доступно объяснять, но у здешних жителей форума, как показывает практика, хорошо развиты телепатические способности, проблем возникнуть не должно
1
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.09.2017, 13:34
Ответы с готовыми решениями:

Раздельная компиляция
Здравствуйте, я перечитал на форуме информацию по этой теме, но пока что не сумел разобраться. У меня в проекте такие файлы: ...

Раздельная компиляция
Пусть есть программа, которая состоит из 2 файлов. 1 файл: основной, там где main 2 файл: содержит некоторые функции Также есть...

раздельная компиляция
Вот есть три файла: заголовочный файл с классом (.h), файл с реализацией методов класса (.cpp), и функцию main. Как, корректно, выполнить...

70
17 / 16 / 3
Регистрация: 18.08.2017
Сообщений: 54
09.09.2017, 21:03
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от hoggy Посмотреть сообщение
значение имеет стандарт языка.
А не практическая деятельность?

Цитата Сообщение от hoggy Посмотреть сообщение
либо код содержит UB,
либо лажают компиляторы.
Покажите, где тут UB или где поведение не соответствует стандарту.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
09.09.2017, 21:29
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
В С++ нет понятия "prvalue объекта". Объект - это объект. Prvalue - это категория результата выражения.
я понимаю так:
всякие lvalue/rvalue/prvalue - категории доступа к объектам.
они определяют контексты в которых можно,
или нельзя получать доступ к объекту.

prvalue - категория доступа к временному объекту.

Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Но даже в тех случаях, когда "result object" существует, этот объект - это не само prvalue, а отдельный самостоятельный объект, лишь инициализированный при помощи этого prvalue.
а можно сказать, что этот "result object" и есть объект, хранящий prvalue.
никакой абсолютно разницы.

Добавлено через 6 минут
Цитата Сообщение от УГнетатель Посмотреть сообщение
Покажите, где тут UB или где поведение не соответствует стандарту.
не тупите: #59
0
17 / 16 / 3
Регистрация: 18.08.2017
Сообщений: 54
09.09.2017, 21:34
Цитата Сообщение от hoggy Посмотреть сообщение
#59
Там написано "не лажают". Раз ссылаетесь на #59, это значит что вы согласны, что не лажают?
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
09.09.2017, 21:43
Лучший ответ Сообщение было отмечено Captain Maxee как решение

Решение

Цитата Сообщение от УГнетатель Посмотреть сообщение
Там написано "не лажают". Раз ссылаетесь на #59, это значит что вы согласны, что не лажают?
значит согласен.
1
17 / 16 / 3
Регистрация: 18.08.2017
Сообщений: 54
09.09.2017, 21:48
Цитата Сообщение от hoggy Посмотреть сообщение
значит согласен.
Несколько сообщений назад было "ну значит, компиляторы лажают". Ну да ладно. Что было — то прошло.

Если не лажают, то, исходя из
Цитата Сообщение от hoggy Посмотреть сообщение
либо код содержит UB,
либо лажают компиляторы.
там UB?
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
09.09.2017, 21:58
Цитата Сообщение от УГнетатель Посмотреть сообщение
там UB?
Цитата Сообщение от hoggy Посмотреть сообщение
не тупите: #59
...
0
17 / 16 / 3
Регистрация: 18.08.2017
Сообщений: 54
09.09.2017, 22:17
hoggy, т.е. ни UB, ни лажи компиляторов нет?

Поразительно быстрые изменения после такого
Цитата Сообщение от hoggy Посмотреть сообщение
мне без разницы как вы думаете.
значение имеет стандарт языка.
либо код содержит UB,
либо лажают компиляторы.
категоричного тона.
0
Велосипедист...
 Аватар для Mournful Max
353 / 220 / 73
Регистрация: 15.12.2015
Сообщений: 785
09.09.2017, 22:26  [ТС]
УГнетатель, можно подумать, Вы никогда в своей жизни не ошибались?
1
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
09.09.2017, 22:40
Цитата Сообщение от УГнетатель Посмотреть сообщение
т.е. ни UB, ни лажи компиляторов нет?
вы какой то странный.
если после #58 и #59 у вас ещё остались какие то вопросы,
то боюсь, я вам помочь ничем уже не смогу.

Цитата Сообщение от УГнетатель Посмотреть сообщение
Поразительно быстрые изменения после такого
мой тезис сохраняет свою актуальность:
если с кодом (любым) есть какая то лажа,
значит одно из двух:
либо налажал программист, либо компилятор.
0
2 / 1 / 1
Регистрация: 22.12.2019
Сообщений: 93
08.09.2020, 23:45
Цитата Сообщение от hoggy Посмотреть сообщение
вам стоит подучить с++
а разве мы можем написать что-то типа const int a; и компилятор это проглотит?
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,306
09.09.2020, 00:04
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Его полный смысл также зависит от контекста, причем как от предыдущего, так и от последующего. То есть и в этом

C++
1
2
extern const int var;
const int var = 0;
и в этом

C++
1
2
const int var = 0;
extern const int var;
случае мы получаем const переменную с внешним связыванием.
Тут я, кстати, не прав. Когда extern-объявление следует за объявлением с уже назначенным связыванием, extern-объявление наследует уже назначенное связывание из предыдущего объявления. Во втором примере переменная var получит внутреннее связывание.

extern-объявление назначает внешнее связывание только тогда, когда оно является самым первым. В первом примере переменная var получит внешнее связывание.
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
09.09.2020, 00:04

Раздельная компиляция
В Гугле не забанен,нашел описание самого принципа,но конкретных примеров не нашел. Вопросы вот какие: 1) Если у меня есть класс,...

Шаблоны и раздельная компиляция
Здравствуйте! Если просто я пишу класс, например: class Test { private: int *pm; ... public: bool inc();

Раздельная компиляция файлов
Если класс определен в раздельных файлах и изменения сделаны в части main программы, кот использует класс - какой файл необходимо...

Раздельная компиляция и шаблоны
Есть 3 файла с кодом: 1) foo.hpp template&lt;typename T&gt; class foo { public: T bar; foo(); ~foo(); };

Раздельная компиляция и шаблоны
привет. возьму вот такой выдуманный пример #ifndef CCLASS_H #define CCLASS_H #include &lt;functional&gt; class...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
71
Ответ Создать тему
Новые блоги и статьи
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 Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
rest api anylogic - выполнение модели на своём русском сайте
anaschu 02.07.2026
Как подружиться с AnyLogic Cloud API, победить провайдеров и развернуться Java-бэкенд в Docker на бесплатном хостинге: Двухдневный лог борьбы Всем привет! Хочу поделиться свежим (и довольно. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru