2 / 2 / 0
Регистрация: 18.09.2021
Сообщений: 119
1

Компоновщик

15.12.2022, 16:03. Показов 604. Ответов 8

Author24 — интернет-сервис помощи студентам
Добрый день.
Люди, разбираюсь с процессом компиляции программы в c++, с помощью Visual Studio компилятора.
В результате работы препроцессора я получил вот такие обработанные .cpp файлы, с заменными #include макросами:
Main.i
C++
1
2
3
4
5
6
7
8
9
10
class MyClass
{
public:
    void Method();
};
 
 
int main() {
    return 0;
}
Header.i
C++
1
2
3
4
5
6
7
8
class MyClass
{
public:
    void Method();
};
void MyClass::Method()
{
}
Итак, на основании того, что препроцессированные(с расширением .i) файлы после ассемблировная компоновщиком склеиваются в один файл - выходную сборку, я ожидаю увидеть ошибку: <повторное объявление class MyClass>(ведь класс объявлен Header.i и в Main.i), но, к моему удивлению - этого не происходит; Хотя если я попытаюсь повторно объявить этот class уже в самой Visual Studio, например, вот так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class MyClass
{
public:
    void Method();
};
 
class MyClass
{
public:
    void Method();
};
 
 
int main() {
    return 0;
}
- программа не с компилируется из-за повторного объявления. Почему так происходит?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.12.2022, 16:03
Ответы с готовыми решениями:

Компоновщик
Помогите пожалуйста. Есть 2 файла, в одном прописаны функции, в другом головной модуль, с...

Компоновщик vs. Шаблоны
Впервые реально понадобились шаблоны и.. затык :( Компановщик ругается так: Собственно в Main...

QTableView и компоновщик QGridLayout
Собственно при добавлении таблицы на форму она выглядит криво. Как это исправить? Скрин #include...

Как создать динамический компоновщик?
Как создать динамический компоновщик?И возможно ли ето сделать(Под динамический я имею в виду чтобы...

8
19405 / 10024 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
15.12.2022, 16:12 2
Bumis, *.i - это для вас файлы, они никуда не склеиваются.

Добавлено через 3 минуты
После препроцессирования единицы трансляции компилируются независимо, получаются obj-файлы, которые затем компоновщик собирает в исполняемый файл. Т.е. исходный текст разных единиц трансляции никто вместе не "склеивает".
0
2 / 2 / 0
Регистрация: 18.09.2021
Сообщений: 119
15.12.2022, 16:14  [ТС] 3
Я имею ввиду, что <после ассемблированая склеиваются их объектные файлы>.
Например, мы получили в процессе ассемблирования такие объектные файлы: Main.obj и Header.obj. Далее линкером они склеиваются в нечто цельное - сборку(.exe, .dll...).
0
19405 / 10024 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
15.12.2022, 16:18 4
Bumis, ну в объектных файлах уже нет никаких классов. Там машинный код по большей части.

Добавлено через 2 минуты
Цитата Сообщение от Bumis Посмотреть сообщение
мы получили в процессе ассемблирования такие объектные файлы: Main.obj и Header.obj. Далее линкером они склеиваются в нечто цельное - сборку
Даже из того, что вы сами сейчас написали, должно быть ясно, что то, что делали вы (объединение исходного кода) и то, что делает компоновщик (объединение объектного кода (маш код + метаинформация и о нем)) - это совсем не одно и то же.
0
2 / 2 / 0
Регистрация: 18.09.2021
Сообщений: 119
15.12.2022, 16:20  [ТС] 5
Хм, как же "независимо", если при попытке скомпилировать такой код:
Header.cpp
C++
1
int a = 0;
Main.cpp
C++
1
2
3
4
5
int a = 0;
 
int main() {
    return 0;
}
Компилятор ясно даёт понять, ошибкой: "int a уже определен в Header.obj", что взаимосвязь между объектными файлами .obj - всё таки есть при сборке.
0
19405 / 10024 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
15.12.2022, 16:25 6
Цитата Сообщение от Bumis Посмотреть сообщение
Хм, как же "независимо",
Компилируется именно независимо.

Цитата Сообщение от Bumis Посмотреть сообщение
Компилятор ясно даёт понять, ошибкой
Не компилятор, а компоновщик.
1
2 / 2 / 0
Регистрация: 18.09.2021
Сообщений: 119
15.12.2022, 16:34  [ТС] 7
Компилируется именно независимо.
Хорошо, спасибо, этот тезис помог мне понять - почему я не получаю ошибку.

Ну теперь вернёмся к самому компоновщику, почему на повторные определения в независимых объектных файлах - он ругается, а на повторные объявления - нет?
0
19405 / 10024 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
15.12.2022, 16:43 8
Лучший ответ Сообщение было отмечено Bumis как решение

Решение

Цитата Сообщение от Bumis Посмотреть сообщение
почему на повторные определения в независимых объектных файлах - он ругается, а на повторные объявления - нет?
Ну потому что объявлений нет в объектном коде.
Объявления существуют на этапе компиляции только.
А про определения вот можете почитать: https://ru.wikipedia.org/wiki/... пределения
И еще вот: https://www.youtube.com/watch?v=G_jcBrrYPAs (там начало видео по теме)
1
2 / 2 / 0
Регистрация: 18.09.2021
Сообщений: 119
15.12.2022, 16:47  [ТС] 9
Понял вас. Спасибо большое за раскрутку <клубочка недопонимания>!
0
15.12.2022, 16:47
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.12.2022, 16:47
Помогаю со студенческими работами здесь

Компоновщик о ликовка программы это одно и тоже?
??????

Шаблонный класс от шаблонного класса, ругается компоновщик
абстрактный класс Хэширования template &lt;class typeHashData, class typeHashIndex&gt; class...

Как на физическом уровне работает компоновщик в приведенном случае
Всем привет! Уважаемые форумчане объясните мне, как, на физическом уровне, работает компоновщик в...

Как влияет inline и обертка(#ifndef #define #endif) .h файла на компоновщик.
Есть файл Point.h: #ifndef POINT_GUARD #define POINT_GUARD ...

Возможно ли подгрузить библиотеку так, чтоб компоновщик подгружал функции из основной программы?
Всем привет! Хотелось бы узнать, возможно ли подгрузить библиотеку так, чтоб компоновщик...

Курсовая работа "Паттерн Компоновщик. Расчет стоимости оборудования исходя из его составных частей."
Предлагаю ознакомиться с моей курсовой работой на данную тему. С заинтересованными обсудим на...


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

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

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