Pull to refresh

Comments 22

Альтернативное название статьи: "За что бить по рукам на Code Review"

Ну почему же? Сompound literals, array designators и отдельные препроцессорные извращения (в частности, описанное в статье - вариация широко известного паттерна X-macro) убийственно полезны в отдельных случаях, сокращая копипасту и улучшая читабельность кода.

"Методы повышения частоты суицидов среди начинающих (и не только) разработчиков."

Интересно, зачем все это в языке? Выглядит как: «смотри как могу!».

Не зачем, а почему. Цели делать шаблоны с++ полными по Тьюрингу тоже не стояло

подозреваю, что большая часть — неожиданные побочные эффекты, либо приемлемые побочные эффекты патчей для дыр в предыдущих версиях спецификации

Пожалуй, пустая директива — самое полезное здесь (или хотя бы безвредное), остальное — это для олимпиад по программированию или для жёского WO-стиля программирования


А так конечно ещё...
Триграф Эквивалентный символ
   ??=  #
    ??/ \
    ??' ^
    ??( [
    ??) ]
    ??! |
    ??< {
    ??> }
    ??- ~

В Си их ещё не отменили....

В драфте C23 триграфы убирают из стандарта как отслужившие своё.

Си лучший, навсегда в моём сердечке. И немного полезного в работе, как правило коллеги не знают, а в статье не увидел (а оно там есть эх): X-MACROS. Великолепная штука, особенно для написания API, правда когда он начинает быть вложенным один в другой становиться жутковато, но для плоских структур самое то.

UFO just landed and posted this here

a[b] буквально эквивалентно (a + b). Таким образом, можно написать абсолютное безумие, например 41[yourarray + 1].

Как будто бы здесь ошибка и a[b] === *(a+b). т.е. обращение к элементу массива есть разыменование суммы начала массива с его индексом.

А 41[yourarray+1] будет эквивалентно не сумме 41+yourarrray+1 (читай "смещению от начала массива на 42"), а разыменованию этой суммы (обращению к 42ому элементу массива).

Ваши программисты должны быть осьминогами, чтобы отстрелить себе напрочь все ноги хотя бы частью приведенных способов.

Слава т.н. богу, что я про это никогда не знал и узнал из статьи на хабре! Устройство Даффа — отрыв башки. Какая цепочка рассуждений может привести здорового человека к такой конструкции?!

Цепочка рассуждений (она, в принципе, описана в Вики) «1 миллион итераций лучше, чем 8 миллионов, но что делать с обработкой хвоста?».

А потом отрыв башки еще и то, что на этой штуке сделали кооперативную многозадачность в одной из RTOS

UFO just landed and posted this here

Статья очень полезная и дает почувствовать, что ты еще не мастодонт из 90 со знанием седого Си)) Реально, фичи интересные и некоторые можно даже применять. Однако, не могу въехать зачем пихать массивы в аргументы функции? Может я не правильно понял саму идею и от этого есть практическая польза?

Статья содержит кашу из как минимум двух разных типов "малоизвестности": действительно интересных темных уголков языка и банальностей из разряда "я просто ленив и не знаю о существовании С99". Непонятно, зачем было мешать это в одну кучу. Compound literals являются "малоизвестной" фичей языка? Серьезно?

Классика вроде Duff's device - неизвестная возможность? Серьезно? Это редко используемая возможность, но ничего "неизвестного" в ней нет.

"Несуразные объявления указателей" - вообще постоянно и массово используемые объявления. Как это сюда попало?

Про "Совместимые объявления и массивы как параметры функций" написана некорректная ерунда. Язык С накладывает разные требования на объявления одной и той же функции, сделанные в разных единицах трансляции и сделанные в одной и той же единице трансляции. От объявлений в одной единице трансляции требуется полное совпадение типа функции. От объявлений в разных единицах трансляции требуется именно совместимость типов. Подчеркну: совместимость - это именно для объявлений, сделанных в разных единицах трансляции. А в статье приведены последовательные объявления в одной единице трансляции и ведется разговор о совместимости...

В сильно заезженной теме "a[b] буквально эквивалентно (a + b) " допущена явная опечатка. Должно быть *(a + b).

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

Sign up to leave a comment.