Nп/п : 89 из 100
 От   : Telegram Channels Robot             2:5055/182        14 окт 23 08:10:10
 К    : All                                                   14 окт 23 11:11:02
 Тема : [](https://telegra.ph/file/47c3ed7789add269b3166.jpg)**Язык мой - вр...
----------------------------------------------------------------------------------
                                                                                 
@MSGID: 2:5055/182 35fef73e
@PID: jNode ver. 1.5
@TID: jNode ver. 1.5
@CHRS: CP866 2
[](https://telegra.ph/file/47c3ed7789add269b3166.jpg)**Язык мой - враг мой**

Время воскресных очешуительных историй.

 Одним из самых отвратительных свойств C++ является способность
компилировать большинство конструкций C.

 В моей практике был случай, когда пару лет пришлось мучительно
ломать башку, как добиться, чтобы безупречно собирающаяся компилятором
библиотека - без единого варнинга со всеми тапками в пол, -Wall, -Wextra и
-Wpedantic - работала без крэшей.

 Есть такая штука в сишечке, как юнион (union). Так вот. Пока вы
используете его с тривиальными POD-типами, имеющими тривиальные конструкторы - все
ча-ча-ча. Кресты его видят, понимают, компилируют и оно работает. Хоть
анонимный union, хоть неанонимный.

 Однако. Если ваш union сдержит __нетривиальный тип__, который, к тому
же, доступен по указателю (мемберы юниона - это указатели на структуры,
да) - у вас не получится позвать нетривиальный конструктор этого типа.
Да-да, я читал ту статью на SO, где предлагается конструктор в юнион
написать и позвать его явно. Во-первых, это не помогает в случае
нетривиального __динамического__ субтипа. Во-вторых, вызов конструктора оператором new
в конструкторе супертипа - компилируется, да. Но в рантайме член юниона
остается неаллоцированным, что и приведет вас прямо к радостным __рандомным__
крэшам в рантайме. Что означает практически UB.

 Вы скажете - агааааааааа, есть же std::variant! Ну, для начала, он
есть начиная с С++17. Что делать тем, кто должен работать на C++11 -
кроме апгрейдов - неясно, да? Во-вторых, эти нехилая такая оберточка поверх
сишного юниона, с кучей оверхеда - как часто бывает в синтаксическом сахаре
- и это означает, помимо всего прочего, кучу писанины на уровне
исходников - вы ж видели спецификации std::variant?

 В целом, картинка достаточно нерадостная, учитывая огромное количество
кода Си с классами.

 И это опять возвращает нас к исходной позиции - это на самом деле
ужасно, что кресты позволяют большинство конструкций Си компилировать. На
практике, этого следует избегать, как чумы. Один мой друг прямо настаивал в
свое время "Пишем на чистых крестах, никакого Си!" - и был абсолютно
прав.

 Либо вы сишник - либо крестовик. Любая попытка как-либо комбинировать
два настолько концептуально разных языка - чревата, по моему личному
опыту, а равно и по опыту других.

PS. __А начиналось-то все невинно, с сишных кастов в крестах, да?__
http://fido.ortoped.org.ru/photo_2023-10-14_08-00-09.jpg

--- hssergey station
 * Origin: jNode ver. 1.5 (2:5055/182)
SEEN-BY: 301/1 460/58 4500/1 5001/100 5005/49
5015/255 5019/40 5020/715 848
SEEN-BY: 5020/1042 4441 12000 5030/49 1081 5055/182
5058/104 5061/133
SEEN-BY: 5083/444
@PATH: 5055/182 5020/1042 4441



   GoldED+ VK   │                                                 │   09:55:30    
                                                                                
В этой области больше нет сообщений.

Остаться здесь
Перейти к списку сообщений
Перейти к списку эх