Jan. 26th, 2017

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

в языке С++ нет модулей (способа группировки сущностей и однозначного выяснения того, где сущность находится), и он пытается это компенсировать огромным количеством механизмов (я насчитал штук 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 файл (то есть не запланировал создание ещё одной ЕК, содержащей не только объявления, но и определения) - компилятор снова мирно согласится с тобой и сгенерирует объявления в твоей ЕК, но при этом НИКТО не знает где взять опеределения сущностей - ни компилятор, ни линкер.
dervish_candela: (Dervish)
прикольная статья которая представляет ооп и функциональное программирование как диалог двух противоположных способов миропознания, начавшийся задолго до появления собственно программирования.
Декарт vs Беркли, fight!
https://medium.freecodecamp.com/descartes-berkeley-and-functional-reactive-programming-18b0b61eac58

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 Sep. 23rd, 2017 09:23 am
Powered by Dreamwidth Studios