1. C++ / Говнокод #11887

    +38

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    #include <iostream>
     
    using namespace std;
     
    class Program
    {
        public:
            friend int main()
            {
                    return 0;
            }
    };

    Мой знакомый говорит, что его компилятор поддерживает Java\C#-нотацию точки входа таким образом. И ещё он говорит, что так должно компилироваться по стандарту.

    Запостил: LispGovno, 07 Октября 2012

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

    • А где же static перед int main()?
      Ответить
      • Дык по стандарту он вроде не нужен. Точнее если его написать после friend, то прога не скомпилируется только из-за факта наличия static рядом с френдом. Такой френд позволяет объявить функцию друга, но в глобальном неймспейсе (или в неймспейсе окружении объекта). Это свойство стандарта С++ используется для написания операторов-друзей.
        Ответить
        • Без статика это будет main с неявным параметром, то есть с неверной сигнатурой.
          Ответить
          • Нет, почитай стандарт.
            Ответить
            • this в friend-функцию такого рода не передаётся:
              http://ideone.com/pYwA8
              Ответить
              • friend автоматом считается за static?
                Ответить
                • Функции-друзья не являются членами класса, хотя описываются именно в классе.

                  Они не считаются за static, они существуют в текущем пространстве имен, а не в классе.
                  Ответить
        • Очередной крестоблядский пиздец... Бессмысленное и беспощадное определение дружественной функции внутри самого класса. Зачем это вообще нужно? Я всю жизнь думал, что френдятся только прототипы функций и классов, а не их тела...
          Ответить
          • Как я и говорил - это нужно для объявления всех операторов в теле класса, например:
            class T
            {/**/
            friend const T operator+(const T& lhs, const int rhs){/**/}
            friend const T operator+(const int lhs, const T& rhs){/**/}
            };
            Ответить
          • Порылся в стандарте. Действительно есть пример подобного использования friend. Можно писать как
            class Test {
                friend void test(Test *t);
            };
            void test(Test *t) {
                // ...
            }
            так и
            class Test {
                friend void test(Test *t) {
                }
            }
            Ответить
            • чего тебя так удивило?
              friend std::ostream & operator << (std::ostream & o, mytype const & m) { ... } сплошь и рядом объявляются прямо в теле класса, в стандарт было незачем лезть
              Ответить
              • > чего тебя так удивило?
                Просто в своем коде никогда не писал так (выносил оператор наружу). А в чужом коде или не встречалось, или, видимо, не обращал внимания на то, как запилены операторы.

                P.S. Лишний раз убеждаюсь, что можно много лет пользоваться с++, и так и не познать его до конца...
                Ответить
                • На сколько баллов из 10ти - ты знаешь С++? Оцените cвои знания. /thread

                  Мои: 4-5
                  Ответить
                  • за количественной оценкой - на brainfuckbench
                    Ответить
                  • Ну зачем эта фаллометрия?
                    Ответить
                    • Да вообще эти тесты хуйня какая-то, спрашивают про поебень, которая в реальной жизни не так уж и нужна, я так где-то год назад на каком-то тесте набрал баллов вдвое больше, чем Пушков.
                      Ответить
                    • >Ну зачем эта фаллометрия?
                      Причем тут фаллометрия? Я предложил оценить свои знания самостоятельно без всяких тестов. Самооценка так сказать. Вот как вам кажется, на сколько вы знаете, стандарт? Между прочим стандартный вопрос на собеседовании.
                      Ответить
                      • >на сколько вы знаете, стандарт?
                        0.5 Русского Стандарта
                        Ответить
                        • на полшишечки
                          Ответить
                        • 1 Русский Стандарт
                          http://www.winebay.ru/userfiles/catalog_items/big/990050_big.jpg
                          Ответить
                          • по мне так лучше http://goo.gl/VkmY4
                            Ответить
                            • Слабонервным не смотреть:
                              http://www.cubisteffects.com/images/RAT/Rat_Header2.jpg
                              Ответить
                              • Спасибо что предупредили, смотреть не стал.
                                Ответить
                              • это ж мышиный король из сказки про Нильса
                                Ответить
                                • > это ж мышиный король из сказки про Нильса
                                  Сенсация! Обитатели говнокодика деанонимизировали @rat4! Читать дальше >>>
                                  Ответить
                  • > На сколько баллов из 10ти - ты знаешь С++?
                    [phallometry]Вчера на odesk.com сдал тест по крестам на 3.9 из 5, и сишечку на 4.4 из 5.[/phallometry]

                    P.S. После теста узнал новый момент в с++:
                    try {
                        throw Derived();
                    } catch (Base b) {
                        // этот catch поймает вброшенный Derived
                    }
                    Ответить
                    • Это же вброс, правда? Тогда почему не зеленым? Вы узнали сейчас принцип работы catch в любом языке. Элсо ловить надо так: Base&
                      Ответить
                      • > Элсо ловить надо так: Base&
                        Про ловлю по ссылке и указателю я прекрасно знал, и именно они - принцип работы catch в любом языке. А вот то, что catch умеет ловить объекты родительского класса по значению, при этом вызывая конструктор копий... вот эту фичу узнал только вчера.
                        Ответить
                        • умеет
                          Ответить
                          • Ох уж эти неверующие минусаторы...
                            http://ideone.com/2hJCu
                            Ответить
                            • Минусуют не за неверение, а за капитанистость.

                              Я же выше написал что это работает. Потом вы написали что это работает. Потом я написал что это работает, но узнал я только вчера. И тут этот коммент "умеет". Ну не к месту же уже, не к месту.
                              Ответить
                        • элсо ловить по указателю не модно, ибо не понятно нужно ли делитеть, тк оно в куче или не нужно, тк оно ещё где-то. Да и вообще зачем делитеть, если & справится со всем сам
                          Ответить
                        • А разгадка одна: исключения - зло. А уж проброс объектов в качестве исключений - трижды зло. Кстати, когда эти объекты удаляются, как это решено?
                          Ответить
                          • >Кстати, когда эти объекты удаляются,
                            Это ж кресты, если не на стеке, то по воле программера только. Или ОС.
                            Ответить
                            • То есть РАИИ на объекты, кидаемые исключением, не действует?
                              Ответить
                              • Если передавать по значению, то объект будет копироваться, если по ссылке - нет. Если по указателю - то нужно убивать самому. Вроде бы так.
                                Ответить
                              • > То есть РАИИ на объекты, кидаемые исключением, не действует
                                Почему же, действует. При вбросе по ссылке разрушается объект при выходе из catch блока, который его поймал. При вбросе по значению - сразу же после того как будет создана копия, а копия разрушится после выхода из catch блока. Если же кидать указатель - само собой придется удалять ручками.

                                P.S. Компилятор может оптимизнуть код, и не делать копию, но RAII работает.
                                Ответить
                                • http://ideone.com/5AHi5
                                  Ответить
                                  • >Catched
                                    Caught
                                    Ответить
                                    • > Caught
                                      Мда, надо мне прокачивать инглиш, половина слов и правил уже забылась.
                                      Ответить
                                • А если кидаемый объект был создан задолго до броска исключения и нужен и после?
                                  Ответить
                                  • Тогда перед вбросом сработает конструктор копий:
                                    http://ideone.com/jMvyc
                                    Ответить
            • Хм, но забавно что в реализации gcc 4.7 в этом случае получается undefined reference to `main'. Вот она - кривизна поддержки стандарта :)
              Ответить
    • > должно компилироваться по стандарту
      нет
      3.6.1 Main function
      /3 ...A program that declares main to be inline or static is ill-formed. ...
      Ответить
      • LispGovno
        >Мой знакомый говорит, что его компилятор поддерживает
        Я так понял, этот зубр где-то в 95ых с командой писал "свой" компилятор крестов.
        Ответить
      • Странно сформулировано. Я бы сказал так:
        A program that declares main with internal linkage is ill-formed
        Ответить
        • в c++11 нельзя еще deleted, constexpr.
          из абзацев, кишащих implementation-defined, я выудил причину, по которой ОП код не приведет к желаемому результату
          Ответить
          • >deleted
            Думаю ты хотел сказать delete.
            int main()=delete;

            О, да...
            А я думал так можно только методы помечать. В чем профит от этого не для методов?
            Ответить
            • я хотел?
              я просто разместил объяву
              A program that defines main as deleted or that declares main to be inline, static, or constexpr is ill-formed.
              deleted function - это как раз = delete
              какое отношение = delete имеет к функциям, а не методам - хоть раздел 8.4.3 Deleted definitions все примеры приводит к методам, думаю, можно вот так:
              #include <iostream>
               
              template <class T>
              void f(T const & t) { std::cout << "f<>: " << t << std::endl; }
               
              void f(int) = delete;
               
              int main()
              {
                      f(10.);  // ok
                      f(1);   // compile error
                      return 0;
              }


              хоть на говнокодике новый стандарт поизучаю :)
              Ответить
              • Это типа не компилировать функцию для конкретных типов?
                Ответить
              • Не нужен.
                #include <iostream>
                template <class T>
                void f(T const & t) { std::cout << "f<>: " << t << std::endl; }
                 
                void f(int);
                
                int main()
                {
                        f(10.);  // ok
                        f(1);   // compile error
                        return 0;
                }
                Ответить
                • не совсем, тут уже получится не compile error, а link error
                  Ответить
                  • какая кресторазница?
                    Ответить
                    • существенная
                      узнать об ошибке через 3 секунды или через 5 минут при линковке огромного говна, особенно когда он напишет малоинформативное "undefined reference to void f(int) in some_fucking_module.o" даже без указания строки, где оно произошло
                      Ответить
                      • А понял, это проблемы из-за невменяемого компилятора, способного иногда целую минуту срать ошибками из-за того, что в одном месте один символ пропущен.
                        Ответить
                  • using namespace std;
                    template <class T>
                    typename enable_if<!is_same<T, int>::value>::type
                     f(T const & t) { std::cout << "f<>: " << t << std::endl; }
                    Тарас, заметь. Только 1 пробел в отступе.
                    Ответить
                    • первая ступень - отрицание полезности нововведений в стандарте
                      вторая ступень - гнев к бюрократам в комитете
                      третья ступень - торг. попытка заключить сделку с судьбой
                      четвертая ступень - депрессия. отчаяние и ужас, потеря интереса к программированию
                      пятая ступень - смирение. "Не более 2% людей переживают эту стадию."
                      Ответить
    • На васме чувак как-то про такое рассказывал - он с линкером как-то так извратился что сделал из метода класса точку входа.
      Ответить
      • А потом приходится писать так?
        int argc = (int)this;
        Ответить
        • Скорее, наоборот. this (по крайней мере, в MSVC) передается в ecx, так что аргументы как были, так и останутся (надеюсь, не ошибся). А вот чтобы вызывать методы класса, нужно сначала создать объект:
          int CMain::main(int argc, const char *argv[])
          {
            CMain *that = new CMain();
            __asm ecx, that
            /*this->*/someMethod();
          }
          Ответить
          • > this (по крайней мере, в MSVC) передается в ecx
            А ну да, так что такой способ с вызовом члена класса как статика лучше вообще не использовать ;) Соглашения о вызовове все-таки разные, и на каком-то компиляторе обязательно заглючит.

            > А вот чтобы вызывать методы класса, нужно сначала создать объект
            Извращаться - так по полной:
            ((CMain*)0)->someMethod()

            http://ideone.com/TJ92O
            Ответить
    • Hello. And Bye.
      <a href=http://farmdirect.ru/shipovnika-sirop-plyus-vitamin-s-otzyvy-instrukcija>Шиповника сироп плюс витамин С - отзывы, инструкция по применению - FarmDirect</a>
      Ответить

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