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 файл (то есть не запланировал создание ещё одной ЕК, содержащей не только объявления, но и определения) - компилятор снова мирно согласится с тобой и сгенерирует объявления в твоей ЕК, но при этом НИКТО не знает где взять опеределения сущностей - ни компилятор, ни линкер.

Date: 2017-01-26 12:03 pm (UTC)
From: [identity profile] megaflop.livejournal.com
а чё, в плюсах нэймспэйсов нет штоле?

Date: 2017-01-26 01:34 pm (UTC)
From: [identity profile] dervish-candela.livejournal.com
неймспейсы то есть, но они just that, средство группировки имён. они точно так же не содержат абсолютно никакой информации о том, где искать сущность Х. более того, один и тот же неймспейс может быть размазан по тысяче разных файлов, и если ты не подключил нужный - что ж, это твоя проблема

Date: 2017-01-26 06:24 pm (UTC)
From: [identity profile] megaflop.livejournal.com
в языках с модулями и импортами иногда таак нехватает вот этого глобального пространства имён сишного и препроцессора )

Date: 2017-01-26 06:31 pm (UTC)
From: [identity profile] dervish-candela.livejournal.com
дело не в глобальном пространсвте имён, а в том что С++ в принципе не позволяет языковыми средствами искать определения. отсюда спираль безумия в любых случаях чуть сложнее тривиальных.

ни разу не помню чтобы в питоне мне не хватало возможности выстрелить себе в ногу с помощью препроцессора :) или потратить пол-дня на ошибки линковки. good riddance!

Date: 2017-01-29 07:33 pm (UTC)
From: [identity profile] kebuda.livejournal.com
Ты не справедлив к С++. Всё это тянется ещё из С :).

Date: 2017-01-29 08:36 pm (UTC)
From: [identity profile] dervish-candela.livejournal.com
ну С (а вернее решение его синтаксически расширять) это чуть ли не главная дыра и причина всех бед С++
не было (да и нет) никакой рациональной причины это делать

Date: 2017-01-30 05:34 am (UTC)
From: [identity profile] kebuda.livejournal.com
Ну Страуструп в своей эволюции и дизайне С++ пишет, что хотел переделать препроцессор на свой, но оставил всё как есть.

Date: 2017-01-30 08:52 am (UTC)
From: [identity profile] dervish-candela.livejournal.com
проблема не в препроцессоре (он всего лишь её симптом)
проблема в том, что в ЯЗЫКЕ нет механизма поиска определений. в принципе. Они «может найдутся, может нет», а компилятора это не ебёт

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. 22nd, 2017 12:35 am
Powered by Dreamwidth Studios