Открыть список
Как стать автором
Обновить

Комментарии 42

НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
Да с третьим примером можно вообще за всю жизнь не столкнуться, если не влезать сильно глубоко в дебри boost, stl или loki.
Вот за такое я и не люблю плюсы:
void (*signal(int, void (*fp)(int)))(int);


Код программы должен читаться как книга, а не как… это…
void(*signal)(int, decltype(myFuncName));
у вас указатель на функцию, а в оригинале — функция возвращающая указатель на функцию
Потому как люди, надо немного больше написать, зато будет читаться легче:
typedef void (*fp)(int);
и наша запись возвращается в ряды 2-ого примера:
fp (*signal)(int, fp);
А что, читается как книга по нелинейным дифурам )))
Это просто крайне дурной стиль программирования.

Вообще, данная статья интересна с точки зрения забавы, но если код и вправду приходится читать по спирали — это просто очень плохой код.
Я боюсь С++, если там ТАК нужно читать каждую строку кода…
Что вы, для остальных строчек правила совершенно другие, сложнее и запутаннее. Вы явно недооцениваете C++.
Поэтому, программисты отдыхают, играя в настольные ролевые игры.
Если не забывать про управление сложностью, Вам любой язык будет казаться удобным инструментом.
Спасибо!
Внятно написано. Попробовал — отнимает больше времени, но в запутанных выражениях чужих исходников реально помогает понять, что же наворотил автор…
Если пользоваться typedef в таких случаях, то жизнь упрощается)
Статья рассматривает вопрос о де-факто свершившемся акте насилия над C++, т.е. когда ничего не остается, кроме как копаться в чужой фантазии.
А так естественно в собственном коде такое надо избегать.
Не даром говорят, что С++ is write only
Любой язык write only, если хорошо постараться. Вопрос культуры программирования всего лишь.
как говорится — это вы еще perl не видели! )))
Я то видел :)
Не знаю где вы тут С++ увидели.
Тут Си, язык продуманный до мелочей.

Статься бесполезна.
Я с самого рождения могу прочесть любое объявление на Си без каких-либо раздумий.
Для тех, кто таким даром не обладает, Керниган и Ритчи написали целую страницу.
Называется она — «Сложные объявления».

Мне вот интересно. Как метод автора справится с char (*(*x[3])())[5]

А по поводу С++ согласен с вами. write only язык.
Ну холивар C vs C++ это явно не тема этого топика.

Имхо статья подает ту самую страницу из K&R в более запоминающейся форме.
Да и с вашим примером метод вроде справляется, или я что-то не понял подвоха?
Чтобы не быть голословным:
x это массив из трех указателей на функцию без параметров возращающую указатель на массив из трех char'ов
typedef char arr[5];

arr * foo()
{
}

int main()
{
    char (*(*x[3])())[5];
    x[0] = foo;
    return 0;
}
может указатель на массив из пяти char'ов?
думаю если хорошенько расставить скобки, пробелы, а может даже и переносы строки, то третий пример будет намного читабельнее
Есть даже тул для этого написанный. Называется cdecl (http://gd.tuwien.ac.at/linuxcommand.org/man_pages/cdecl1.html). И у него даже есть онлайн версия (http://cdecl.org/).
Кстати, cdecl этот работает в обе стороны. Можно на английском описать тип, а он его в С преобразует.
Последний пример эта онлайн-версия не осилила. Говорит, syntax error.
Надо вот так: void (*signal(int, void (*)(int)))(int), т.е. fp убрать. Оно не понимает имен у параметров указателей на функции.
После нескольких дней чтения исходников всяких gnome-овских приложений окончательно убедился, что Си — это ад. Но за статью спасибо, очень доступно. Хотя думаю после недельных перерывов без С++ по-прежнему буду входить в ступор при виде 'char * const' и 'const char*' :)
В WebKit код ещё интересней ;-)
Нытики и неосиляторы детектед. Вполне себе краткая и компактная запись, после некоторой практики читается на ура.
Используйте typedef-ы, и забейте на эти объявления
Что хочется отметить. Статья вовсе не про С++.
Все приведенные примеры — чистый Си.

Да, конечно С++ позволит вам написать те же самые конструкции, но… тем не менее на С++ так обычно не пишут. Обычно так пишут как раз на Си.

Пример номер 3, как уже отмечали — пример плохого кода. Этот код сложно:
1. Читать
2. Понимать
3. Исправлять
4. Дополнять.

Я понимаю, что автор кода преодолеет все 4 указанные сложности, но если он этот код передает другому человеку (коллективная разработка), то код становится источником постоянных ошибок и фиксов.
Блога по чистому Си вроде не существует. А языки очень родственные, так что почему бы и нет.И в заголовке отображено что речь идет о Си.
топиком промахнулся)
Функция, принимающая указатель на функцию и возвращающая указатель на функцию — это действительно ultimate.

Хотя где-нибудь запросто может использоваться, например при построении ООП на C (виртуальный метод для данного метода).
Знакомого одного речь вспоминается мне:
Замечательно конечно. Но именно такие вещи как правило и отталкивают.
Лютвидж Доджсон(aka Льюис Кэрролл) не застал все эти компьютеры и языки программирования. Его код и методы разработки особенно интересно было бы читать…
Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.