Как писать функции, применимые к разным типам данных, или Мнимый полиморфизм в C (Си)
ฝัง
- เผยแพร่เมื่อ 7 ก.พ. 2025
- Вы замечали, что одним и тем же оператором * можно умножать числа самых разных типов - а вот вывод на печать требует очень разных команд форматирования (% и дальше целый зоопарк)? Не говоря уж об аргументах функций. Не говоря уж о массивах. Не говоря уж… А почему, собственно, не говоря? Давайте поговорим! И избавимся от диктата типов данных (ну, почти).
Я программирую на c++ и то давно уже не программирую. И я не знаю зачем я вообще смотрю лекцию про си, особенно с учетом того, что мне через 4 часа на работу вставать. Но очень залипательно! Лайк, подписка и с нетерпением жду ещё Ваших лекций!
Очень признателен за вашу работу и эту публикацию. Она мне как философу поможет обосновать решение проблемы субъектности и связи математики с социальной философией. Спасибо!
Очень кртая лекция и не менее крутая лектор. Большое спасибо за понятное объяснение и интересную тему.
Коммент в поддержку канала ❤❤❤
Мне прям очень^2 нравиться как Вы рассказываете.
я не читал и не слушал ещё, но сама постановка проблемы очень обрадовала, это то, о чём я давненько думал, но не знал, как подступиться. Чуть освобожусь - и стану читать и вникать, спасибо огромное автору ❤
С моей подпиской к Вам придёт много народа. Так держать!
Женщина в Си это конечно удивительно и интересно, если бы у меня был такой учитель информатики думаю я бы полюбил программирование ещё в школе
Удивительно - это слон в 3D-принтере :) А женщины - они где только не, чего б и не в Си.
Сейчас-то полюбили? Надеюсь, да!
@olgapavlova я-то уже 5 лет как полюбил, руководитель в крупном банке в 26. А мог прям со школы, тогда в 18 можно было бы уже выходить на рынок труда сразу на достойные условия. Так что школота - мотайте на ус.
какая кринжатина всё-таки, и оно ж даже не понимает что пишет емое
Си прост, но нужно быть гением, чтобы понять его простоту.
И нужно быть PhD, чтобы понять, что там, где действительно нужна была простота, имеем...
За 10 лет кодинга так и не столкнулся с ситуацией, где бы этот полиморфизм был прям нужен-нужен. Но для учебных целей, понимать, какую хрень тянет за собой всё это .... ДА, ЭТО ПОЛЕЗНО!
опять питон🙃🪱🪱. Благодарю Вас, много нового узнал👍🤝
Ждём видео про произвольное количество аргументов!! Возможно кстати можно кодогенерацию как-то настроить?
Да, дней через 10 сделаю про произвольное количество аргументов.
Кодогенерацию в некоторых объёмах можно, постараюсь чуть позже показать основные штуки там.
30:25 Ещё хорошей практикой для макросов является использование конструкции do{}while(0)
Сам пишу на Python, но поскольку он написан на С, то однозначно лайк
По логике большинство компиляторов и интерпретаторов ЯП так или иначе написано на C и ASM.
Поскольку во freepascal(да, я патологоанатом) одинаково названные функции, но с разными аргументами считаются разными и ошибок компиляции не вызывают, я по наивности своей предполагал, что в в С тоже самое))) а оказывается необходимо женерик городить, но всё равно прикольно. А людей "боящихся" точку-с-запятой предлагаю в программисты не брать)))
Оооо!!!! Шикарная тема!
Здравствуйте. Спасибо лекцию. После просмотра сразу возникли вопросы. 1) Как макрос _Generic реагирует на наличие модификаторов const, volatile, restrict у управляющего выражения? Он их отбрасывает, или нужно писать "реализацию" под каждый вариант/варианты? Или явно кастовать в тип без модификаторов? 2) Если передать NULL напрямую (без посредников-указателей) в управляющую конструкцию, то разве весь макрос не раскроется по ветке с int, ведь NULL = 0 по факту?
Прекрасные вопросы, спасибо.
Отвечу в двух словах.
1. Все верхнеуровневые квалификаторы типа отвалятся перед сравнением. То есть тип const int в вариантах задавать нет смысла, достаточно int. И отличить тип с квалификатором от типа без квалификатора (верхнеуровневого) нельзя всё по той же причине: cvr-квалификаторы не доживают до момента сравнения, отваливаются.
2. В большинстве компиляторов конкретно для Си NULL - это макрос для сущности с типом (void *). Так что он чаще всего и опознаётся как void *. Что до равенства нулю, то это, скажем так, встречается, но далеко не повсеместно. Вообще тут не устоялась норма, насколько я знаю.
Если ошибаюсь, буду рада об этом узнать.
Был на ютубе канал "си от эксперта", не обновлялся уже давно. Будете ли Вы рассматривать "тонкие" моменты при программировании в Си ( появление "утечек памяти", откуда они берутся, если в явном виде выделения не происходило и подобные моменты )?
А это тонкие? Я просто пребываю в счастливом заблуждении, что утечки памяти - это ого-го какие толстые моменты :) Наберу материала - расскажу, конечно. Спасибо за мысль!
2:00
В Си для мелочи-встройки или при очень строгих требованиях по быстродействию лучше переписать алгоритм под нативные для железки форматы данных, а сам язык позволяет удобно писать не выходя за рамки возможностей железа.
19:20
NULL - это не значение "ноль", это указатель (!!!) типа void, указывающий на нулевой адрес. При чтении такого указателя без разыменования будет считываться ноль, но тип такой "переменной" будет приводиться к типу, используемому в данной аппаратуре для указателей, как и при чтении любого другого указателя. В большинстве случаев это будет int. Но не всегда.
...
В целом - жуть. Зашёл на заголовок про полиморфизм в Си, на деле тут вводная о том как написать макросы для реализации перегрузки в Си.
Может быть, язык и позволяет, а вот образовательные материалы по нему - нет.
Вы правы, NULL - это _в большинстве случаев_ (но не всегда) void*.
Знаете, я, пожалуй, продолжу ориентироваться не на вас, а на свою аудиторию и свои задачи.
Правкам в комментах буду рада, могут пригодиться (а могут и нет).
@@olgapavlova
Си как язык по сути является человекочитаемым аппаратно-независимым ассемблером, об этом часто забывают. Заходить в Си без знаний о регистрах, разрядности, ширине слов, АЛУ и прочих базовых понятий довольно странно. Все похожие на С++, C#, Java и других языков фокусы были введены в язык для того чтобы в компиляторах были одни и те же ассемблерные определения и поэтому рантаймы библиотеки написанные на разных языках в принципе можно было использовать совместно.
Ну хорошо, не всегда на void. В любом случае, в Си и плюсах при начале работы на новой платформе и/или новом компиляторе всегда надо смотреть хотя бы в содержимое stddef, а не удивляться приведению к типу, указанному в макросе стандартного заголовочного файла.
На тему ориентирования на аудиторию - в названии слово полиморфизм, а не деле всё не выходит за рамки самописного велосипеда для перегрузки имён функций. Это по сути введение в заблуждение.
Нужен высокоуровневый язык с прямым доступом к памяти - берите плюсы. Си нужен там, где программист проверяет в дизассемблере вывод тулчейна, для чего в свою очередь нужно чтобы символы в дизассемблере и символы в исходнике всегда совпадали.
Правки комментов - смотрю видео, по ходу дела пишу и дописываю комментарий. Так и получаются правки.
Ответственный подход, спасибо.
Вообще я очень рада, что в комменты пришли люди, лучше меня (гораздо лучше!) разбирающиеся в предмете.
Вы правы насчёт того, что без базовых понятий заходить в Си странно. Однако перед нами реальность: Си массово используют как первый язык. Да, в надежде на то, что человечество отвлечётся от Python и заметит, что программирует на железненьком таком компьютере, а не на Всемогущей Универсальной Шайтан-Машине с GUI-интерфейсом :-) Но, увы, это приводит к тому, к чему приводит: «Слушай, а программа - это вообще что?» Приходится объяснять.
Разным людям разное. Заходите ещё :) Можно чуть позже, когда с драйверами будем развлекаться (точно будем).
Познавательно очень! Расскажите какой стек применяете на работе? В каком области работаете?
Моя компания автоматизирует дизайн интерфейсов. От Си это очень, очень далеко.
@@olgapavlova что востребовано знать и уметь чтобы работать в eduhund?
@@tuksser TypeScript + React + общая эрудиция по фронтенду и сетям - ваши верные друзья :) Но мы пока не нанимаем.
Просто апплодирую стоя😊
Здравствуйте, а в рамках чего проходят данные стримы? Есть какой-то курс по си?
Да просто рассказываю что кажется интересным, никаких формальностей :)
Ждём продолжение
Для процессора вообще нет таких понятий как переменная и тип данных. Существует только понятие данных и размера этих данных (byte, word, dword, qword). А остальное - это уже высокоуровневая интерпретация.
Ещё два шага - и мы доберёмся до того, что нет никаких нулей и единиц, а есть только по соглашению высокий и по тому же соглашению низкий уровень напряжения. И между ними кое-что внезапно вполне осязаемое :)
Короче, каждой истории свой уровень абстракции.
А где можно посмотреть расписание будущих стримов?
Хорошая идея, спасибо. Вывешу в описание канала.
Ближайший - про ошибки как часть дизайна программы на C (Си).
@@olgapavlova это просто великолепно!
Отличный канал, как получить ваши замечательные настройки vim?
Спасибо за вопрос. Выложу. К сожалению, не обещаю, что скоро.
1:14:33 офигенный пример
Ольга, а вы знате плюсы (C++)? Если да, то будут видео по нему?
Ага, будут видео по C++ - примерно через полгода.
Многие плачут по поводу форматированных строк в Python? Ошалеть, для меня новость, покажите этих людей (образно). Наоборот, большинство в восторге как это удобно и функционально. Нет разве?
Это смотря где искать это «большинство». Впрочем, как всегда.
@@olgapavlova Наверное. Знаю много народа кто пишет на питоне, что бы кто-то из них был недоволен f строками, ни знаю ни одного. Я даже перемотал и еще раз прослушал момент про то что плачут от форматированной строки, подумал может не то имелось ввиду.
Спасибо за интересный контент
Я не очень разобрался, но скорее всего проблема в том, что макрос подставлял не название функции, а её вызов. По всей видимости нужен более хитрый способ для подмены переменных для случая, когда типы меняются местами.
Добью вопрос, ага. Спасибо за идею!
Зачем это все чтобы напечатать одну строчку. Джависты: и это всё?
В каком редакторе происходит написание кода?
vim
Ольга вы очень обаятельная и грамотная женщина.
Почему бы вам не записать видео где вы рассказываете о себе, о занятиях и увлечениях?
@@Retro_Botanik Спасибо за идею!
@@olgapavlova Наш человек!!! Самый лучший редактор ( настроил под себя, с остальными только мучался месяцами ).
"Зловещая пауза" (с) 😊
Кто понял, тот понял
С таким применением union не согласен, а остальное - отлично.
А как вы его обычно используете?
@@olgapavlova Обычно я его использовал, когда требовалось что-то разобрать на байты, или собрать обратно. Очень удобный инструмент при разборе, например, сетевых пакетов.
Я не очень знаю, на кого расчитано данное видео, но как профессиональный программист на Си у меня глаза вытекают, чем вам точка с запятой не угодила? А коментарии кирилецей - это вообще мрак, за такое по рукам бьют ещё на первых курсах универа. Больше похоже на какое-то баловство. Извините за критику, но что есть, просто не хочу чтобы это считалось нормальным.
Вы правы. Там за скобками остались кое-какие понятные для слушателей умолчания, в том числе про кириллицу. Но лучше явно прокомментировать, что да, комменты на русском - это не то, что стоит практиковать, а только поясняющий инструмент к видео.
@@olgapavlova Перечитал свой коментарий, всё равно получилось немного резкова-то, спасибо за ответ. На самом деле если не обращать внимания на эти мелочи, то видео всё равно полезно для понимания как эти возможности языка можно использовать, просто всё рассказано немного как для детей из-за чего сложно воспринимать тем, кто уже разбирается в теме, но для тех, кто в первые программирует, видео в самый раз будет, и да вы правы, что, важнее, чтобы человек потом мог понять написанные коментарии, чем на каком языке они написаны.
А как вам Zig?
О, вы уже второй, кто спрашивает :) Определённого мнения пока нет, но это временно. Расскажу, как будет что.
То есть на Си надо написать целую библиотеку чтобы сделать аналог паскалевского WriteLn(); ?) Эх, отсталый язык!)
И не говорите! Дикие люди, дети гор :)
У нас есть WriteLn дома (printf)
Я от не понимаю любителей С... ну ведь уже ж есть шаблоны в С++ :) Уже все изобрели и оттестировали. И виртуальность всякая есть. Нет, продолжают изобретать С++ в частных случаях.
Насамперед це iграшка. Як на мене, дуже цикава.
@@olgapavlova Думаю, для линукса пропихнули. Я код ядра как-то глянул - случайный файл - и сразу увидел, как они там С++ /виртуальные функции изобретают. Зато все вручную, с "полным контролем". Я этого "контроля" наелся на МК-61 :))
так пусть изобретают, если есть желание. Всегда можно изобрести что-то новое. Если бы было таких людей, то, возможно, до сих пор на велосипеде ездили бы ногами от земли отталкиваясь :) Однако ж педали крутим.
Есть программы которые действительно хуже работают если написаны на с++ а не с. Это RT (реал тайм) приложения. Си код более поозрачен и главное более предсказуем по времени выполнения любого участка кода. Полной предсказуемости нет всё равно но всё гораздо более предсказуемо чем в Си++ программе где STL используется. Другая крайность это Си# там есть уборка мусора и любой деструктор не предсказуем. То есть время выполнения мало зависит от кода если объекты там создаются или удаляются а вот количество и фрагментированность свободной памяти на момент выполнения этого кода очень даже сильно влияют. Насчёт прозрачности тоже на голом Си как-то проще. В отладчике зайти в функцию это действительно зайти в одну функцию а в Си++ зачастую пока зайдёшь прийдется зайти и выйти в кучу функций преобразования для аргументов желаемой функции. Отладка в Си прозрачнее.
Я думаю изобретают, потому что С++ используют те кто пишет на С++, а вот С часто бывает мостом для других языков через FFI. Он проще как раз сопрягается с другими языками и поэтому ценен сам без С++.
Типобезопасность в С - это просто ну конечно нужен не дедушкин С а какой-то более современный модификант или С3 на худой конец
Дорастём - разберём, ага.