Велосипедист...
353 / 220 / 73
Регистрация: 15.12.2015
Сообщений: 785
1

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

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

Author24 — интернет-сервис помощи студентам
Не совсем понимаю процесс раздельной компиляции, или то как работает связывание 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
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.09.2017, 13:34
Ответы с готовыми решениями:

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

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

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

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

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

Цитата Сообщение от hoggy Посмотреть сообщение
либо код содержит UB,
либо лажают компиляторы.
Покажите, где тут UB или где поведение не соответствует стандарту.
0
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
09.09.2017, 21:29 62
Цитата Сообщение от 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 63
Цитата Сообщение от hoggy Посмотреть сообщение
#59
Там написано "не лажают". Раз ссылаетесь на #59, это значит что вы согласны, что не лажают?
0
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
09.09.2017, 21:43 64
Лучший ответ Сообщение было отмечено Captain Maxee как решение

Решение

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

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

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

Цитата Сообщение от УГнетатель Посмотреть сообщение
Поразительно быстрые изменения после такого
мой тезис сохраняет свою актуальность:
если с кодом (любым) есть какая то лажа,
значит одно из двух:
либо налажал программист, либо компилятор.
0
2 / 1 / 1
Регистрация: 22.12.2019
Сообщений: 93
08.09.2020, 23:45 70
Цитата Сообщение от hoggy Посмотреть сообщение
вам стоит подучить с++
а разве мы можем написать что-то типа const int a; и компилятор это проглотит?
0
Вездепух
Эксперт CЭксперт С++
11691 / 6370 / 1723
Регистрация: 18.10.2014
Сообщений: 16,052
09.09.2020, 00:04 71
Цитата Сообщение от 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
09.09.2020, 00:04
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.09.2020, 00:04
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
71
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru