Comments 22
Альтернативное название статьи: "За что бить по рукам на Code Review"
Ну почему же? Сompound literals, array designators и отдельные препроцессорные извращения (в частности, описанное в статье - вариация широко известного паттерна X-macro) убийственно полезны в отдельных случаях, сокращая копипасту и улучшая читабельность кода.
Да камон, 10 лет назад и не такое рассказывали. А тут-то что, тут даже почти не страшно.
"Методы повышения частоты суицидов среди начинающих (и не только) разработчиков."
Интересно, зачем все это в языке? Выглядит как: «смотри как могу!».
Пожалуй, пустая директива — самое полезное здесь (или хотя бы безвредное), остальное — это для олимпиад по программированию или для жёского WO-стиля программирования
Триграф Эквивалентный символ
??= #
??/ \
??' ^
??( [
??) ]
??! |
??< {
??> }
??- ~
В Си их ещё не отменили....
Си лучший, навсегда в моём сердечке. И немного полезного в работе, как правило коллеги не знают, а в статье не увидел (а оно там есть эх): X-MACROS. Великолепная штука, особенно для написания API, правда когда он начинает быть вложенным один в другой становиться жутковато, но для плоских структур самое то.
//практичное
int k;
sizeof k;
a[b] буквально эквивалентно (a + b). Таким образом, можно написать абсолютное безумие, например 41[yourarray + 1].
Как будто бы здесь ошибка и a[b] === *(a+b)
. т.е. обращение к элементу массива есть разыменование суммы начала массива с его индексом.
А 41[yourarray+1]
будет эквивалентно не сумме 41+yourarrray+1
(читай "смещению от начала массива на 42"), а разыменованию этой суммы (обращению к 42ому элементу массива).
Ваши программисты должны быть осьминогами, чтобы отстрелить себе напрочь все ноги хотя бы частью приведенных способов.
Слава т.н. богу, что я про это никогда не знал и узнал из статьи на хабре! Устройство Даффа — отрыв башки. Какая цепочка рассуждений может привести здорового человека к такой конструкции?!
На хабре есть отличная стать о VLA: клик.
Статья очень полезная и дает почувствовать, что ты еще не мастодонт из 90 со знанием седого Си)) Реально, фичи интересные и некоторые можно даже применять. Однако, не могу въехать зачем пихать массивы в аргументы функции? Может я не правильно понял саму идею и от этого есть практическая польза?
Статья содержит кашу из как минимум двух разных типов "малоизвестности": действительно интересных темных уголков языка и банальностей из разряда "я просто ленив и не знаю о существовании С99". Непонятно, зачем было мешать это в одну кучу. Compound literals являются "малоизвестной" фичей языка? Серьезно?
Классика вроде Duff's device - неизвестная возможность? Серьезно? Это редко используемая возможность, но ничего "неизвестного" в ней нет.
"Несуразные объявления указателей" - вообще постоянно и массово используемые объявления. Как это сюда попало?
Про "Совместимые объявления и массивы как параметры функций" написана некорректная ерунда. Язык С накладывает разные требования на объявления одной и той же функции, сделанные в разных единицах трансляции и сделанные в одной и той же единице трансляции. От объявлений в одной единице трансляции требуется полное совпадение типа функции. От объявлений в разных единицах трансляции требуется именно совместимость типов. Подчеркну: совместимость - это именно для объявлений, сделанных в разных единицах трансляции. А в статье приведены последовательные объявления в одной единице трансляции и ведется разговор о совместимости...
В сильно заезженной теме "a[b]
буквально эквивалентно (a + b)
" допущена явная опечатка. Должно быть *(a + b)
.
"Одиночный #
" - это на самом деле интересная тема, которую автор не раскрыл. В стародавние времена, когда проход препроцессора по коду был дорогим удовольствием, существовало соглашение, что исходный файл обрабатывается препроцессором только в том случае, если его первый символ - #
. Как правило директивы #include
стоят в самом начале файла, то есть это соглашение было вполне разумным. Но в некоторых случаях получалось так, что файл не начинался с #
, а обработку препроцессором все-таки нужно было запросить. Вот именно в этом случае в файл первой строкой ставили пустую директиву #
. Сегодня эта возможность уже не актуальна, а пустая директива может использоваться разве что для косметического оформляжа.
Малоизвестные возможности языка C