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

    +994

    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
    template< typename _Data >
    void 
    Foo< _Data >::deduceNumberOfSignificant( _Data _field )
    {
    	switch( sizeof( _Data ) )
    	{
    	case sizeof( field32 ):
    		m_significantNumber = 7;
    		break;
    	case sizeof( field64 ):
    		m_significantNumber = 16;
    		break;
    	case sizeof( field128 ):
    		m_significantNumber = 34;
    		break;
    	default:
    		BOOST_ASSERT( "Improper field size" );
    	}
    }

    Запостил: kiry, 30 Января 2012

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

    • законность переданного типа можно и в компайл-тайм вполне оценить
      да и стиль говёный, спору нет

      но на мой взгляд больше говнокод в том, что непонятным методом явно изменяют состояние члена класса - хранят число от левого аргумента, полезность этого вызывает много вопросов
      Ответить
      • Ты про какой стиль? Оформление?
        Ответить
        • стиль кода
          пробелы внутри скобок, нижние подчеркивания перед именами
          Ответить
          • Это очень субъективно, и самое некритичное в кодингстандарте.
            Ответить
            • а вы, батенька, мудак (с)
              Ответить
            • ISO/IEC 14882:2003
              17.4.3.1.2 Global names
              - Each name that begins with an underscore is reserved to the implementation for use as a name in the global namespace.

              это здорово, когда местечковый кодинг-стандарт переопределяет стандарт языка
              Ответить
              • Но ведь там про глобальные имена в контексте использования программой стандартной библиотеки, а тут параметр метода который никак не пересекается с глобальными именами.
                Ответить
                • Тем более значит не было смысла использовать подчеркивание
                  Ответить
                  • Не было смысла и нельзя разные вещи всё же.
                    Ответить
                    • > Не было смысла и нельзя
                      Each name that contains a double underscore (_ _) or begins with an underscore followed by an upper-case letter (2.11) is reserved to the implementation for any use.
                      // somewhere in <mynewcompilerdefines.h>
                      typedef int   _Data;  // I can do this, because I'm a compiler
                      
                      //.....
                      template< typename _Data >
                      //.....
                      > main.cpp:123 (error) compiler says: all your code are belong to shit now
                      Ответить
                      • Разве? Можешь прислать полный пример кода?
                        Ответить
                        • насчет typedef поспешил с выводами

                          окей, компилятор делает у себя в заголовке, т.к. for any use
                          #define _Data int

                          проблема остается
                          Ответить
                          • Макросы там отдельно описаны (17.4.3.1.1 Macro names), вероятно их специально отделяют от глобальных имён, ибо "The identifier immediately following the define is called the macro name".
                            Ответить
                            • В этом пункте ничего не сказано об ограничениях на имя, только сказано, что даже если в системном .h файле будет пустой дефайн #define XXX, это повод пользователю не использовать его, в т.ч. запрещено делать ему #undef.
                              А вот следующий пункт как раз раскрывает что зарезервировано за for any use, что зарезервировано за global names. Плюс где то отдельным пунктом сделана отсылка к сишному наследию в виде va_* и т.д.
                              В итоге:
                              Reserved in any scope, including for use as implementation macros:
                              --- identifiers beginning with an underscore and an uppercase letter
                              --- identifiers containing adjacent underscores (or "double underscore")
                              Reserved in the global namespaces:
                              --- identifiers beginning with an underscore
                              Also, everything in the std namespace is reserved. (You are allowed to add template specializations, though.)
                              Ответить
                              • http://stackoverflow.com/questions/228783/what-are-the-rules-about-using-an-underscore-in-a-c-identifier
                                Ответить
                              • Я понимаю, что на оверфлоу большинство поддержало такой "итог".
                                И всё же, в стандарте говорится отдельно про глобальные имена, и про макроимена отдельно, хотя могли бы не заморачиваться, а написать identifer.
                                Ответить
                              • Кстати, в такие имена балуются и в бусте.
                                Ответить
                                • > в бусте
                                  можно ссылку?
                                  Ответить
                                  • http://svn.boost.org/svn/boost/trunk/boost/archive/detail/polymorphic_iarchive_route.hpp
                                    template <class _Elem, class _Tr>
                                    polymorphic_iarchive_route(

                                    http://svn.boost.org/svn/boost/trunk/boost/gil/utilities.hpp
                                    template <typename _D1, typename _D2> deref_compose(const deref_compose<_D1,_D2>& dc) : _fn1(dc._fn1), _fn2(dc._fn2) {}

                                    http://svn.boost.org/svn/boost/trunk/boost/pending/queue.hpp
                                    http://svn.boost.org/svn/boost/trunk/boost/typeof/typeof_impl.hpp
                                    И т.д., искать не сложно.

                                    Я уже молчу про хедергарды типа #ifndef _BOOST_UBLAS_EXPRESSION_TYPE_, которые тоже ни-ни.
                                    Ответить
                                    • никто и не говорил, что ни-ни
                                      я вообще ожидал будет хуже, если честно

                                      Аркадий в typeof погорячился один раз в _Typeof_iteration, зато попробуй реализуй в 2004 году аналог auto и decltype
                                      gil == Adobe Inc., спасибо что подарили
                                      pending - если бы не grep, об этой папке не узнал бы даже - осиротевший в 2002/2004 какой-то проект
                                      archive - пацаны подглядели шаблон для basic_(i/o)stream в MSVC, два раза
                                      в общем то не слишком густо

                                      более-менее стараются люди всё же следовать несчастным 4 требованиям naming conventions из
                                      http://www.boost.org/development/requirements.html#Design_and_Programming, хорошие, годные требования

                                      хедергарды да, проблема, даже в наших конторских кодах этого наследия диких 90-х __MYCOOLHEADER_H__ навалом
                                      Ответить
          • Про нижние подчёркивания согласен, чем пробелы не угодили?
            Ответить
            • Пробелы растягивают код. Нормальная подсветка синтаксиса и так всё позволяет увидеть. Без лишних пробелов.
              Ответить
              • Ну так может и {} не нужны, табы и подсветка рулят?
                Ответить
              • Форматирование не нужно. Нормальный кулхацкер, кто умеет писать на языке С++, и так прочитает кот. А ламер и так не прочитает кот.
                Ответить
              • Ну, растягивают, да. Когда это успело стать проблемой?
                Ответить
                • Просто зачем, если и так всё четко разделено?
                  Ответить
    • > 7,16,34
      странная арифметика, почему не 8,16,32?
      Ответить

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