1. Си / Говнокод #19835

    −48

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    #include <gtk/gtk.h>
    
    int main(int argc, char *argv[], GtkWidget* vbox) {
    
    	GtkWidget *window;
    
    	gtk_init(&argc, &argv);
    
    	window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    	gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
    	gtk_window_set_default_size(GTK_WINDOW(window), 450, 700);
    	gtk_window_set_title(GTK_WINDOW(window), "Model Viewer (Version 36)");
    
    	//test();
    
    	menubar(window);
    	opengl(window);
    
    	gtk_widget_show_all(window);
    
    	gtk_main();
    
    	return 0;
    }

    https://www.linux.org.ru/forum/development/12523254

    Запостил: mittorn, 17 Апреля 2016

    Комментарии (60) RSS

    • "Рановато вы за опенгл да с менюбарами взялись, с хелловорлдов обычно начинают."
      Ответить
    • int main(int argc, char *argv[], GtkWidget* vbox)
      Ответить
      • поэтому, начиная c systemd версии 248, со встроенными wayland и gtk, все старые С/С++ программы не будут больше совместимы с Linux.
        Ответить
        • Linux вообще-то _start вызывает :) А мостик между _start и main() влинкован в виде crt1.o или подобного.
          Так что подменить его и будет вам main() с желаемым прототипом.

          (да, я знаю про зеленый текст, просто я зануда)
          Ответить
          • Увеличу уровень занудности. При соглашении вызова cdecl лишний аргумент при вызове не помеха, потому что он будет молча проигнорирован, а стек очищен вызывающим модулем. Т. е. если crt1.o заталкивает в стек GtkWidget* vbox при вызове main'а, а main на это не рассчитан, то... ничего опасного не произойдёт.

            Хуже если наоборот, crt1.o вызывает main всего с двумя аргументами, а в нашей программе сигнатура main содержит GtkWidget* vbox. Тогда только Царь знает, куда указывает vbox.
            Ответить
            • На самом деле main в posix (или в линуксе) вызывается с int argc, char** argv, char** envp. Так что вполне понятно, куда он указыается.
              Ответить
              • > На самом деле

                на самом деле там в компилере/линк скриптах есть магия которая в зависимости от прототипа main() генерит его правильный вызов, с правильным количеством аргументов.

                по крайней мере раньше (pre C89?). потому что `void main()` было тоже разрешено, и компилер всовывал туда еще `exit(0)`, дефолтный код выхода. но похоже это больше не поддерживается, так как С стандарт больше `void main()` не разрешает.

                где-то и читал, и в прошлом `void main()` видел.
                Ответить
                • > void main()` не разрешает
                  Зато он гораздо более ужасную вещь разрешает - int main() без return...
                  Ответить
                  • я к слову про это читал и это тестировал. читал что как и `void main()`, если нет `return`, то будет аналогично `exit(0)`.

                    то ли гцц это не умеет, то ли фиг его знает, но возврат из майна это результат последней операции. типа `int main() { printf("\n"); }` выйдет с кодом 1 (потому что printf() возвращает 1 потому что один символ выводит.)
                    Ответить
                    • > но возврат из майна это результат последней операции
                      Там, емнип, от -std= очень сильно зависит. На каких-то стандартах - 0, на каких-то - UB, как и в обычных функциях (та самая единичка, затесавшаяся в eax после printf).

                      Только вот с каким стандартом чо - не помню. Поэтому я всегда что-нибудь возвращаю, ибо нехуй...
                      Ответить
                    • Потестил:
                      -std=c89 => UB
                      -std=c90 => UB
                      -std=c99 => 0
                      Ответить
                      • Т.е. это ёбаное дерьмо - свежатинка. Как обычно узаконили какую-то бесполезную хуйню, вместо того, чтобы вменяемую диагностику добавить...
                        Ответить
                        • думаю что просто не стали сражаться с кучей древнего архаического софта.

                          ЗЫ да, версии стандарты я не догадался подёргать.
                          Ответить
                          • > древнего архаического софта
                            Который мирно жил с UB'ом десятилетиями, пока в C99 эту срань не узаконили...

                            Имхо, не та проблема, которая предвещает много сражений. При сборке говнософта достаточно было бы добавить одну строку в конец main'а. Всё.

                            Выпилили же в конце-концов говнофичу с мутабельными строковыми литералами, никто особо и не возмущался (хотя я своими глазами видел софт, который эту говнофичу абузил)...
                            Ответить
                            • софт до стандартизации работает "as is": код компилера есть стандарт.

                              если pre-ANSI конпилеры это обрабатывали - то оно не было UB. понятие UB появилось только после стандартизации.

                              я этой фишкой проникся на Perl5 vs Perl6. Perl6 это стандарт, а Perl5 - это реализация. Если в Перл5 что-то не работает/работает загадочно официальный ответ "смотреть в код". Для Перл6 - "смотри в стандарт, и открывай баги для твоей конкретное реализации."
                              Ответить
                              • Анус от верблюда еще не треснул-то?
                                Ответить
                              • ааа
                                живой программист на перл в 2016м году
                                Ответить
                                • Он его даже защищать пытался.
                                  Ответить
                                  • я обожаю перл, кстати

                                    жалко что на нем сейчас 0 вакансий, 0 проектов и 0 человек им пользуется
                                    Ответить
                                    • не скажи
                                      https://spb.hh.ru/vacancy/16448792?query=perl
                                      Ответить
                                      • да да, жив курилка
                                        жж написан на перле
                                        много всякой широкоиспользуемой или сложно-подменимой дряни типа otrs, bugzilla написано на перле
                                        Ответить
                                        • жж да, но это же наследие
                                          ну вон кое-что и на Коболе написано в бизнесе-то)

                                          а зачем багзила? Ишью треккеров сейчас как грязи же
                                          Ответить
                                          • ну сейчас у нас редмайн в этой роли
                                            сравнивая одно с другим, могу ответственно заявить - всё говно кроме мочи
                                            Ответить
                                            • redmine это вроде под .net?

                                              Я кушал Jira, кушал Mantis и Yourkit.
                                              Еще думал bugtrack попробовать.

                                              В общем я согласен с тем что все говно.
                                              Ответить
                                              • редмайн это раби
                                                Ответить
                                                • ааа) а что плохого в редмайн кстати?
                                                  Ответить
                                                  • если учесть, что это изначально не багтрекер, то ничего
                                                    много кликать надо, чтобы состояние задачи изменить
                                                    групповое редактирование отсутствует

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

                                                    вот всё времени нет в отделе автоматизировать перевод кучи задач (багов) из состояния в состояние при сдаче релиза в тестирование, а уж о том, чтобы бюрократизировать учет рабочего времени, или хотя бы ведение всех задач проекта в нём и речи нет - если инструмент тормозит рабочий процесс, то он просто не выживает
                                                    Ответить
                                                    • Извини, но ты редмайн не умеешь готовить.
                                                      Ответить
                                                      • и это все?
                                                        Ответить
                                                        • Ну а чо, по пунктам расписывать? Ну ок...
                                                          1. В редмайне есть контекстное меню, много кликать не надо, чтобы состояние задачи поменять. Кстати, это же и групповое редактирование. Если из самого таска, то есть плагины, вроде этого: https://www.redmine.org/plugins/issue_hot_buttons
                                                          2. У редмайна очень простая и понятная структура БД. Автоматизируется там всё, что угодно, и как угодно, такая банальность, как автоматический перевод из статуса в статус вообще за три минуты делается.
                                                          3. Любая бюрократия тормозит рабочий процесс. А уж делать из редмайна учёт рабочего времени... Мне кажется, что вы там упоролись... Впрочем, можно плагины поискать, вдруг уже кто-то до вас так же упоролся.
                                                          Ответить
                                                          • > Кстати, это же и групповое редактирование.
                                                            ну вот видишь, не спросил бы, и не узнал о таком
                                                            он даже кастомные поля умеет группой дрочить!
                                                            спасибо добрый человек

                                                            > А уж делать из редмайна учёт рабочего времени
                                                            был у нас один исполнительный директор
                                                            пытался заставить вести весь учет в редмайне, а также считать косты по кокомо, которого он переработал на предыдущей работе
                                                            но, как грицца, если коллектив плюнет в тебя, ты утонешь
                                                            Ответить
                                    • Хорошо там, где нас нет?

                                      P.S. А в рашке уже вторник.
                                      Ответить
                                      • Да просто оно все либо тупое, либо туго конфигурированное

                                        под Jira надо много буков на джаве писать (вооюще не люблю атласин) под йоркит вообще на их собственном DSL:)
                                        Ответить
                                • а чо. удобная утилита. как язык - да, уже давно попахивает. но как утилита для решения повседневных задач - тем более настолько надежная - сложно найти альтенативу.
                                  Ответить
                                  • перл-то?
                                    ну да, однострочники писать когда седа и авка мало

                                    тащемто он для того и делался: чтобы логи парсить. Ларри не виноват что потом какие-то упыри начали на нем делать веб-приложения и писать сложную бизнес-логику
                                    Ответить
                                    • можно успешно и что-то большее писать. просто имо язык и синтакс в 21й век так окончательно и не пришли: ОО все еще тормозное и синтакс через ж, пропертисы у объектов так и не заработали.
                                      Ответить
                                      • хуевое ООП
                                        синтаксис через жопу

                                        да это же джаваскрипт!!!
                                        Ответить
                        • Зато хелловорлд на сишечке на 17% короче если return убрать :)
                          Ответить
                  • не вижу проблемы. Было undefined, стало defined behavior. От этого как бы не может стать хуже.
                    Ответить
                    • А по-хорошему - надо было ошибку конпеляции узаконить, а не очередной бесполезный частный случай.

                      > не может стать хуже
                      От узаконенного говна лучше язык уж точно не стал.
                      Ответить
                      • к чему такая педантичность? Поведение программы же однозначно. Вообще считаю, что любая функция по завершению без return'a должна выдать default constructed value. Более того, я бы хотел такого поведения при вызове return'a без параметра.
                        Ответить
                • > потому что `void main()` было тоже разрешено
                  > где-то и читал, и в прошлом `void main()` видел.

                  Да, было такое. Очень давно. Вообще много всякой хрени было

                  main()
                  main(void)
                  void main()
                  void main(void)
                  int main(void)

                  Чего никогда не видел, так это:
                  auto main(void)
                  Ответить
                  • auto main() -> int
                    да и вообще есть шанс что ребята, пришедшие из других яп будут делать что-то вроде
                    #define function auto
                    
                    function someFunc() -> int { // such syntax, much wow
                    Ответить
                • >На самом деле
                  https://github.com/lattera/glibc/blob/master/csu/libc-start.c#L87
                  Никакой магии линковщика нет, main всегда такой.
                  Возможно, на платформах, где ABI не допускает забивать на последние аргументы, магия действительно происходит.
                  Ответить
            • >При соглашении вызова cdecl
              Только в линуксах нифига не cdecl
              Ответить
          • > да, я знаю про зеленый текст

            ваша информация устарела. systemd заменит libc своей встроенной версией уже начиная с версии 244. bash - с версии 258. GNOME - с версии 268. само собой разумеется начиная с этой версии KDE/Qt/этц приложения больше не будут поддерживаться.
            Ответить
            • скоро все приложения под linux будут писаться на языке .ini файлов в виде юнитов .application и запускать их надо будет так

              systemctl launch postgres.applicatio
              Ответить
              • > скоро все приложения под linux будут писаться на языке .ini файлов в виде юнитов .application

                как только systemd дойдёт до поглощения gcc. sendmail.cf путь указал. писаться все будет на Valа и GCC будет это в набор .ini/.application переводить. зато секурити - потому что никаких тебе буффер оверфлоу. ;-)
                Ответить
      • А вдруг это просто кресты и перегруженная функция?
        Ответить
    • я просто оставлю это здесь:
      int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow);
      Ответить
    • Блять. Почитал комменты и понял - конпеляторы правят миром.
      Если хочешь править миром - пиши конпеляторы, %abusername%. Чем больше конпеляторов напишешь - тем больше ты правишь миром.
      Я всё сказал, наверное.
      Ответить
      • Хуя ты молодец. Да, конечно, конпеляторы правят миром, программеры, которые пишут под эти конпеляторы ваще не в счёт...
        Ответить
      • даже говнокодеры не будут юзать говномпеляторы
        Ответить

    Добавить комментарий