Кресты / Говнокод #11887 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
#include <iostream>
 
using namespace std;
 
class Program
{
    public:
        friend int main()
        {
                return 0;
        }
};

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

Запостил: LispGovno LispGovno, (Updated )

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

    • Дык по стандарту он вроде не нужен. Точнее если его написать после friend, то прога не скомпилируется только из-за факта наличия static рядом с френдом. Такой френд позволяет объявить функцию друга, но в глобальном неймспейсе (или в неймспейсе окружении объекта). Это свойство стандарта С++ используется для написания операторов-друзей.
      Ответить
      • Без статика это будет main с неявным параметром, то есть с неверной сигнатурой.
        Ответить
      • Очередной крестоблядский пиздец... Бессмысленное и беспощадное определение дружественной функции внутри самого класса. Зачем это вообще нужно? Я всю жизнь думал, что френдятся только прототипы функций и классов, а не их тела...
        Ответить
        • Как я и говорил - это нужно для объявления всех операторов в теле класса, например:
          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
                Ответить
                • > На сколько баллов из 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 умеет ловить объекты родительского класса по значению, при этом вызывая конструктор копий... вот эту фичу узнал только вчера.
                      Ответить
                          • Минусуют не за неверение, а за капитанистость.

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

                              P.S. Компилятор может оптимизнуть код, и не делать копию, но RAII работает.
                              Ответить
          • Хм, но забавно что в реализации 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;
              }
              Ответить
                  • существенная
                    узнать об ошибке через 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% людей переживают эту стадию."
                    Ответить
  • На васме чувак как-то про такое рассказывал - он с линкером как-то так извратился что сделал из метода класса точку входа.
    Ответить
      • Скорее, наоборот. 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>
    Ответить

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

Где здесь C++, guest?!

    А не использовать ли нам bbcode?


    8