dervish_candela: (Dervish)
[personal profile] dervish_candela
моё примерное на сегодня понимание. копипащу сюда, разу же написал, чтоб не пропало.

в языке С++ нет модулей (способа группировки сущностей и однозначного выяснения того, где сущность находится), и он пытается это компенсировать огромным количеством механизмов (я насчитал штук 5, что ли), но основные из них - это единицы компиляции, механизм препроцессинга, и объектные файлы (линковка)

грубо говоря, скомпилировать можно только .cpp файл (смысл не в расширения, а в той информации что кладётся в файлы - объявления или реализация).
несмотря на то, что .h файл может казаться главным, на самом деле он кусок говна на палочке: обычно он содержит просто некие объявления сущностей. он ни содержит не реализации сущностей, ни абсолютно никакого указания на то, где эти сущности искать - никому, ни компилятору, ни линкеру. за всё это отвечаешь ты, программист (хахаха).

нормальный процесс выглядит так - препроцессор для каждого .cpp файла тупо сливает в него текст включённых в него .h файлов, и получившийся монстр компилятор компилирует в единицу компиляции.
если вдруг у тебя в .h файле есть реальный код - например функция не только объявлена, но и определена, компилятор согласится с тобой и сгенерирует её определение в этой же единице компиляции.

а если этот .h файл включён в ещё одну единицу компиляции (в другой .cpp) - компилятор опять согласистя с тобой и снова сгенерирует определение, уже в этой ЕК... и при попытке слинковать это линкер скажет «лол што, у тебя две реализации, не хочу». именно поэтому, насколько я могу понять, происходит вот эта фигня: чтобы писать определения функций в h-файле, приходится им добавлять inline - вместо одной функции в одном объектном файле компилятор намеренно генерирует эту функцию в каждом объектном файле ... при этом не выставляя её наружу для линковки?

http://stackoverflow.com/a/41737096/294763
An inline function is defined in all translation units that use it, while a non-inline function is defined in one translation unit only as required by the one definition rule. That is what an inline declaration of a function means; it relaxes the one definition rule, but also gives the additional requirement of being defined in all translation units that use it (which would not have been possible if the odr wasn't relaxed).

а вот если ты добавляешь в проект дополнительный, уже существующий код, и включил в одну из твоих ЕК .h файл, но не добавил в проект его .cpp файл (то есть не запланировал создание ещё одной ЕК, содержащей не только объявления, но и определения) - компилятор снова мирно согласится с тобой и сгенерирует объявления в твоей ЕК, но при этом НИКТО не знает где взять опеределения сущностей - ни компилятор, ни линкер.
From:
Anonymous( )Anonymous This account has disabled anonymous posting.
OpenID( )OpenID You can comment on this post while signed in with an account from many other sites, once you have confirmed your email address. Sign in using OpenID.
User
Account name:
Password:
If you don't have an account you can create one now.
Subject:
HTML doesn't work in the subject.

Message:

 
Notice: This account is set to log the IP addresses of everyone who comments.
Links will be displayed as unclickable URLs to help prevent spam.

April 2017

S M T W T F S
       1
234 5678
9101112131415
16171819202122
23242526272829
30      

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jul. 26th, 2017 12:24 pm
Powered by Dreamwidth Studios