Комментарии 42
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
Да с третьим примером можно вообще за всю жизнь не столкнуться, если не влезать сильно глубоко в дебри boost, stl или loki.
0
Вот за такое я и не люблю плюсы:
Код программы должен читаться как книга, а не как… это…
void (*signal(int, void (*fp)(int)))(int);
Код программы должен читаться как книга, а не как… это…
+15
void(*signal)(int, decltype(myFuncName));
0
у вас указатель на функцию, а в оригинале — функция возвращающая указатель на функцию
0
Потому как люди, надо немного больше написать, зато будет читаться легче:
typedef void (*fp)(int);
и наша запись возвращается в ряды 2-ого примера:
fp (*signal)(int, fp);
typedef void (*fp)(int);
и наша запись возвращается в ряды 2-ого примера:
fp (*signal)(int, fp);
+2
А что, читается как книга по нелинейным дифурам )))
+20
Это просто крайне дурной стиль программирования.
Вообще, данная статья интересна с точки зрения забавы, но если код и вправду приходится читать по спирали — это просто очень плохой код.
Вообще, данная статья интересна с точки зрения забавы, но если код и вправду приходится читать по спирали — это просто очень плохой код.
+3
Я боюсь С++, если там ТАК нужно читать каждую строку кода…
+10
Что вы, для остальных строчек правила совершенно другие, сложнее и запутаннее. Вы явно недооцениваете C++.
+41
Поэтому, программисты отдыхают, играя в настольные ролевые игры.
0
Если не забывать про управление сложностью, Вам любой язык будет казаться удобным инструментом.
0
Спасибо!
Внятно написано. Попробовал — отнимает больше времени, но в запутанных выражениях чужих исходников реально помогает понять, что же наворотил автор…
Внятно написано. Попробовал — отнимает больше времени, но в запутанных выражениях чужих исходников реально помогает понять, что же наворотил автор…
+2
Если пользоваться typedef в таких случаях, то жизнь упрощается)
+1
Статья рассматривает вопрос о де-факто свершившемся акте насилия над C++, т.е. когда ничего не остается, кроме как копаться в чужой фантазии.
А так естественно в собственном коде такое надо избегать.
А так естественно в собственном коде такое надо избегать.
+3
Не даром говорят, что С++ is write only
+6
Любой язык write only, если хорошо постараться. Вопрос культуры программирования всего лишь.
+3
как говорится — это вы еще perl не видели! )))
+1
Я то видел :)
0
Не знаю где вы тут С++ увидели.
Тут Си, язык продуманный до мелочей.
Статься бесполезна.
Я с самого рождения могу прочесть любое объявление на Си без каких-либо раздумий.
Для тех, кто таким даром не обладает, Керниган и Ритчи написали целую страницу.
Называется она — «Сложные объявления».
Мне вот интересно. Как метод автора справится с char (*(*x[3])())[5]
А по поводу С++ согласен с вами. write only язык.
Тут Си, язык продуманный до мелочей.
Статься бесполезна.
Я с самого рождения могу прочесть любое объявление на Си без каких-либо раздумий.
Для тех, кто таким даром не обладает, Керниган и Ритчи написали целую страницу.
Называется она — «Сложные объявления».
Мне вот интересно. Как метод автора справится с char (*(*x[3])())[5]
А по поводу С++ согласен с вами. write only язык.
-8
Ну холивар C vs C++ это явно не тема этого топика.
Имхо статья подает ту самую страницу из K&R в более запоминающейся форме.
Да и с вашим примером метод вроде справляется, или я что-то не понял подвоха?
Имхо статья подает ту самую страницу из K&R в более запоминающейся форме.
Да и с вашим примером метод вроде справляется, или я что-то не понял подвоха?
0
Чтобы не быть голословным:
x это массив из трех указателей на функцию без параметров возращающую указатель на массив из трех char'ов
x это массив из трех указателей на функцию без параметров возращающую указатель на массив из трех char'ов
typedef char arr[5]; arr * foo() { } int main() { char (*(*x[3])())[5]; x[0] = foo; return 0; }
+6
может указатель на массив из пяти char'ов?
+4
думаю если хорошенько расставить скобки, пробелы, а может даже и переносы строки, то третий пример будет намного читабельнее
-1
Есть даже тул для этого написанный. Называется cdecl (http://gd.tuwien.ac.at/linuxcommand.org/man_pages/cdecl1.html). И у него даже есть онлайн версия (http://cdecl.org/).
+6
Кстати, cdecl этот работает в обе стороны. Можно на английском описать тип, а он его в С преобразует.
+3
Последний пример эта онлайн-версия не осилила. Говорит, syntax error.
0
Надо вот так: void (*signal(int, void (*)(int)))(int), т.е. fp убрать. Оно не понимает имен у параметров указателей на функции.
0
После нескольких дней чтения исходников всяких gnome-овских приложений окончательно убедился, что Си — это ад. Но за статью спасибо, очень доступно. Хотя думаю после недельных перерывов без С++ по-прежнему буду входить в ступор при виде 'char * const' и 'const char*' :)
0
В WebKit код ещё интересней ;-)
0
Нытики и неосиляторы детектед. Вполне себе краткая и компактная запись, после некоторой практики читается на ура.
-5
Используйте typedef-ы, и забейте на эти объявления
0
Что хочется отметить. Статья вовсе не про С++.
Все приведенные примеры — чистый Си.
Да, конечно С++ позволит вам написать те же самые конструкции, но… тем не менее на С++ так обычно не пишут. Обычно так пишут как раз на Си.
Пример номер 3, как уже отмечали — пример плохого кода. Этот код сложно:
1. Читать
2. Понимать
3. Исправлять
4. Дополнять.
Я понимаю, что автор кода преодолеет все 4 указанные сложности, но если он этот код передает другому человеку (коллективная разработка), то код становится источником постоянных ошибок и фиксов.
Все приведенные примеры — чистый Си.
Да, конечно С++ позволит вам написать те же самые конструкции, но… тем не менее на С++ так обычно не пишут. Обычно так пишут как раз на Си.
Пример номер 3, как уже отмечали — пример плохого кода. Этот код сложно:
1. Читать
2. Понимать
3. Исправлять
4. Дополнять.
Я понимаю, что автор кода преодолеет все 4 указанные сложности, но если он этот код передает другому человеку (коллективная разработка), то код становится источником постоянных ошибок и фиксов.
+3
Блога по чистому Си вроде не существует. А языки очень родственные, так что почему бы и нет.И в заголовке отображено что речь идет о Си.
0
топиком промахнулся)
0
Функция, принимающая указатель на функцию и возвращающая указатель на функцию — это действительно ultimate.
Хотя где-нибудь запросто может использоваться, например при построении ООП на C (виртуальный метод для данного метода).
Хотя где-нибудь запросто может использоваться, например при построении ООП на C (виртуальный метод для данного метода).
0
Знакомого одного речь вспоминается мне:


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